Skip to content

Commit bd965ef

Browse files
kostyanf14YanVugenfirer
authored andcommitted
RHEL-101554: [viosock/tcp-bridge] Exit threads when recv read 0 bytes
According to https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-recv If the connection has been gracefully closed, the return value is zero. This means that connection is closed and service can stop bridging actions. Signed-off-by: Konstantin Kostiuk <[email protected]>
1 parent f33d3a3 commit bd965ef

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

viosock/tcp-bridge/bridge.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ DWORD WINAPI CBridge::ThreadV2T(LPVOID lpParam)
9999
while ((recvLen = recv(pBridge->m_VsockClientSocket->GetSocket(), Buffer, BufferLen, 0)) != SOCKET_ERROR)
100100
{
101101
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_THREAD_VT_TRANSFER, "V -> T: recv %d bytes\n", recvLen);
102+
if (recvLen == 0)
103+
{
104+
TraceEvents(TRACE_LEVEL_INFORMATION,
105+
DBG_THREAD_VT,
106+
"Thread V -> T: V socket has been gracefully closed, exiting\n");
107+
break;
108+
}
109+
102110
sendLen = send(pBridge->m_TcpSocket->GetSocket(), Buffer, recvLen, 0);
103111
if (sendLen == SOCKET_ERROR)
104112
{
@@ -123,6 +131,14 @@ DWORD WINAPI CBridge::ThreadT2V(LPVOID lpParam)
123131

124132
while ((recvLen = recv(pBridge->m_TcpSocket->GetSocket(), Buffer, BufferLen, 0)) != SOCKET_ERROR)
125133
{
134+
if (recvLen == 0)
135+
{
136+
TraceEvents(TRACE_LEVEL_INFORMATION,
137+
DBG_THREAD_VT,
138+
"Thread T -> V: T socket has been gracefully closed, exiting\n");
139+
break;
140+
}
141+
126142
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_THREAD_VT_TRANSFER, "T -> V: recv %d bytes\n", recvLen);
127143
sendLen = send(pBridge->m_VsockClientSocket->GetSocket(), Buffer, recvLen, 0);
128144
if (sendLen == SOCKET_ERROR)

0 commit comments

Comments
 (0)