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);