示例#1
0
        /// <summary>
        /// USBMux端口映射
        /// </summary>
        /// <param name="localServeIp">本地服务器IP</param>
        /// <param name="localPort">本地监听端口</param>
        /// <param name="remotePort">远端(iOS)端口</param>
        public void CreateUSBMuxConnect(string localServeIp = "127.0.0.1", int localPort = 2222, uint remotePort = 22)
        {
            //连接打开成功,建立双向通道负责数据转发
            Socket     s        = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建Socket对象
            IPAddress  serverIP = IPAddress.Parse(localServeIp);
            IPEndPoint server   = new IPEndPoint(serverIP, localPort);                                         //实例化服务器的IP和端口

            s.Bind(server);
            s.Listen(0);
            int    socket = 0;
            Socket cSocket;

            cSocket = s.Accept(); //用cSocket来代表该客户端连接
            int ret = MobileDevice.USBMuxConnectByPort(MobileDevice.AMDeviceGetConnectionID(DevicePtr),
                                                       MobileDevice.htons(remotePort), ref socket);

            if (ret != (int)kAMDError.kAMDSuccess)
            {
                //连接错误,跳出
                throw new Exception($"USBMuxConnectByPort Error.Code:{ret}");
            }

            IntPtr conn = IntPtr.Zero;

            if (OpenConnection(socket, out conn)) //socket链接通过AFC函数来打开,然后剩下工作交给映射的recv和send函数,函数模型和winsock相同
            {
                if (cSocket.Connected)            //测试是否连接成功
                {
                    Thread serverToRemoteThread = new Thread(() => { ConnForwardingThread(cSocket.Handle.ToInt32(), socket); });
                    serverToRemoteThread.Start();
                    Thread remoteToServerThread = new Thread(() => { ConnForwardingThread(socket, cSocket.Handle.ToInt32()); });
                    remoteToServerThread.Start();
                }
            }
        }