/** * Client mode connection thread. * * @returns iprt status code. * @param hSelf Thread handle. Use to sleep on. The main thread will * signal it to speed up thread shutdown. * @param pvUser Ignored. */ static DECLCALLBACK(int) txsTcpClientConnectThread(RTTHREAD hSelf, void *pvUser) { for (;;) { /* Stop? */ RTCritSectEnter(&g_TcpCritSect); bool fStop = g_fTcpStopConnecting; RTCritSectLeave(&g_TcpCritSect); if (fStop) return VINF_SUCCESS; /* Try connect. */ /** @todo make cancelable! */ RTSOCKET hTcpClient; Log2(("Calling RTTcpClientConnect(%s, %u,)...\n", g_szTcpConnectAddr, g_uTcpConnectPort)); int rc = RTTcpClientConnectEx(g_szTcpConnectAddr, g_uTcpConnectPort, &hTcpClient, RT_SOCKETCONNECT_DEFAULT_WAIT, &g_pTcpConnectCancelCookie); Log(("txsTcpRecvPkt: RTTcpClientConnect -> %Rrc\n", rc)); if (RT_SUCCESS(rc)) { hTcpClient = txsTcpSetClient(hTcpClient, true /*fFromServer*/); RTTcpClientCloseEx(hTcpClient, true /* fGracefulShutdown*/); break; } if (txsTcpIsFatalClientConnectStatus(rc)) return rc; /* Delay a wee bit before retrying. */ RTThreadUserWait(hSelf, 1536); } return VINF_SUCCESS; }
/** * Disconnects from the host and resets the receive state. * * @returns nothing. */ void USBProxyBackendUsbIp::disconnect() { if (m->hSocket != NIL_RTSOCKET) { int rc = RTPollSetRemove(m->hPollSet, USBIP_POLL_ID_SOCKET); Assert(RT_SUCCESS(rc) || rc == VERR_POLL_HANDLE_ID_NOT_FOUND); RTTcpClientCloseEx(m->hSocket, false /*fGracefulShutdown*/); m->hSocket = NIL_RTSOCKET; } resetRecvState(); }
/** * Tries to reconnect to the USB/IP host. * * @returns VBox status code. */ int USBProxyBackendUsbIp::reconnect() { /* Make sure we are disconnected. */ disconnect(); /* Connect to the USB/IP host. */ int rc = RTTcpClientConnect(m->pszHost, m->uPort, &m->hSocket); if (RT_SUCCESS(rc)) { rc = RTTcpSetSendCoalescing(m->hSocket, false); if (RT_FAILURE(rc)) LogRel(("USB/IP: Disabling send coalescing failed (rc=%Rrc), continuing nevertheless but expect increased latency\n", rc)); rc = RTPollSetAddSocket(m->hPollSet, m->hSocket, RTPOLL_EVT_READ | RTPOLL_EVT_ERROR, USBIP_POLL_ID_SOCKET); if (RT_FAILURE(rc)) { RTTcpClientCloseEx(m->hSocket, false /*fGracefulShutdown*/); m->hSocket = NIL_RTSOCKET; } } return rc; }