Пример #1
0
        /// <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;
                }
            }
        }
Пример #2
0
        /// <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);
        }