/// <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(); } } }