Tcp 如何避免来自服务器的[RST]数据包?
我的客户端应用程序正在向路由器Tcp 如何避免来自服务器的[RST]数据包?,tcp,wireshark,winsock,Tcp,Wireshark,Winsock,我的客户端应用程序正在向路由器webserver发送httpreq。服务器用预期的数据进行响应,但wireshark流量显示,在每次事务之后,服务器都在发送[RST,ACK]&[RST]tcp数据包,我认为这不是一个好主意 我的客户端为每个http事务创建(并关闭)新的socket。但是从[RST]看来,我的客户机正在服务器关闭的套接字上发送数据包。在我的recv功能中,服务器响应为“远程主机强制关闭了现有连接” 数据包9(见下图)是来自服务器的http回复消息,其中包含FIN标志;这可能意味着
webserver
发送http
req。服务器用预期的数据进行响应,但wireshark流量显示,在每次事务之后,服务器都在发送[RST,ACK]
&[RST]
tcp
数据包,我认为这不是一个好主意
我的客户端为每个http
事务创建(并关闭)新的socket
。但是从[RST]
看来,我的客户机正在服务器关闭的套接字上发送数据包。在我的recv
功能中,服务器响应为“远程主机强制关闭了现有连接”
数据包9(见下图)是来自服务器的http
回复消息,其中包含FIN
标志;这可能意味着我应该用[FIN,ACK]
响应,而不仅仅是下图所示的[ACK]
[我的客户端应用程序仅用ACK
响应,即在数据包10]
当我在应用层工作时,它们是在recv
之后传输FIN
信号的机制吗
我的客户端应用程序使用的是Winsoc
我猜您的客户端实际上是错误的,例如在HTTP请求后发送更多数据或发送格式稍有错误的请求。服务器在关闭之前没有完全读取HTTP请求也可能是错误的。不幸的是,您没有提供客户端和服务器的必要部分,因此这只是猜测。对于recv
之后的传输FIN:插座关闭或关闭将完成此操作。但这不太可能修复RST。@SteffenUllrich:你说得对。我正在向服务器发送更多数据。[RST]现在消失了。非常感谢。
do{
ret_err = recv(MySocket, recv_buffer, RECV_BUFF_LENGTH, 0);
if (ret_err == SOCKET_ERROR){
break; /* Ignoring errors [server response : "An existing connection was forcibly closed by the remote host" */
}
} while(ret_err != 0);
HANDLE_WINSOC_ERR(shutdown(MySocket, SD_RECEIVE));
closesocket(MySocket);