/// <summary> /// Connections the forwarding thread. /// </summary> /// <param name="from">From.</param> /// <param name="to">To.</param> private void ConnForwardingThread(int from, int to) { byte[] recv_buf = new byte[256]; int bytes_recv, bytes_send; while (true) { bytes_recv = MobileDevice.recv(from, recv_buf, 256, 0); if (bytes_recv == -1) { //string errorMsg = new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()).Message;//Winsock错误获取 int errorno = Marshal.GetLastWin32Error(); if (errorno == 10035) //10035 Socket无数据报错,可能函数原型为异步非阻塞,这里作为阻塞式调用而导致异常,可以忽略 { continue; } MobileDevice.closesocket(from); MobileDevice.closesocket(to); break; } bytes_send = MobileDevice.send(to, recv_buf, bytes_recv, 0); if (bytes_recv == 0 || bytes_recv == -1 || bytes_send == 0 || bytes_send == -1) { MobileDevice.closesocket(from); MobileDevice.closesocket(to); break; } } }
/// <summary> /// 接收Socket消息,主要为接收设备返回的指令结果,大部分为Plist,所以函数内将会自行作转换 /// </summary> /// <param name="sock"></param> /// <returns></returns> public object ReceiveMessageFromSocket(int sock) { if (sock < 0) { return(null); } int recvCount; uint buffer = 0; uint reviceSize = 0; uint dataSize = 0; IntPtr zero = IntPtr.Zero; if (DeviceSecureIOContext != IntPtr.Zero && SocketContext != IntPtr.Zero) { if (MobileDevice.AMDServiceConnectionReceive(SocketContext, ref buffer, 4) == 4) { dataSize = MobileDevice.ntohl(buffer); //获取数据总长度 if (dataSize <= 0) { Console.WriteLine("receive size error, dataSize:" + dataSize); return(null); } zero = Marshal.AllocCoTaskMem((int)dataSize); if (zero == IntPtr.Zero) { Console.WriteLine("Could not allocate message buffer."); return(null); } var tempPtr = zero; while (reviceSize < dataSize) { recvCount = MobileDevice.AMDServiceConnectionReceive_1(SocketContext, tempPtr, (int)(dataSize - reviceSize)); if (recvCount <= -1) { Console.WriteLine("Could not receive secure message: " + recvCount); reviceSize = dataSize + 1; } else if (recvCount == 0) { Console.WriteLine("receive size is zero. "); break; } tempPtr = new IntPtr(tempPtr.ToInt64() + recvCount); reviceSize += (uint)recvCount; } } } else if (MobileDevice.recv_UInt(sock, ref buffer, 4, 0) == 4) { dataSize = MobileDevice.ntohl(buffer); //获取数据总长度 if (dataSize <= 0) { Console.WriteLine("receive size error, dataSize:" + dataSize); return(null); } zero = Marshal.AllocCoTaskMem((int)dataSize); if (zero == IntPtr.Zero) { Console.WriteLine("Could not allocate message buffer."); return(null); } var tempPtr = zero; while (reviceSize < dataSize) { recvCount = MobileDevice.recv(sock, tempPtr, (int)(dataSize - reviceSize), 0); if (recvCount <= -1) { Console.WriteLine("Could not receive secure message: " + recvCount); reviceSize = dataSize + 1; } else if (recvCount == 0) { Console.WriteLine("receive size is zero. "); break; } tempPtr = new IntPtr(tempPtr.ToInt64() + recvCount); reviceSize += (uint)recvCount; } } var datas = IntPtr.Zero; var srcRef = IntPtr.Zero; if (reviceSize == dataSize) { datas = CoreFoundation.CFDataCreate(CoreFoundation.kCFAllocatorDefault, zero, (int)dataSize); if (datas == IntPtr.Zero) { Console.WriteLine("Could not create CFData for message"); } else { var errorString = IntPtr.Zero; srcRef = CoreFoundation.CFPropertyListCreateFromXMLData(CoreFoundation.kCFAllocatorDefault, datas, CFPropertyListMutabilityOptions.kCFPropertyListImmutable, ref errorString); if (srcRef == IntPtr.Zero) { Console.WriteLine("Could not convert raw xml into a dictionary: " + Convert.ToString(CoreFoundation.ManagedTypeFromCFType(ref errorString))); return(null); } } } if (datas != IntPtr.Zero) { try { CoreFoundation.CFRelease(datas); } catch { } } if (zero != IntPtr.Zero) { Marshal.FreeCoTaskMem(zero); } var result = CoreFoundation.ManagedTypeFromCFType(ref srcRef); if (srcRef != IntPtr.Zero) { CoreFoundation.CFRelease(srcRef); } return(result); }