winsock生成重置(RST)的tcp closesocket方法

winsock生成重置(RST)的tcp closesocket方法,tcp,winsock,closesocket,Tcp,Winsock,Closesocket,Windows套接字关闭(closesocket)函数生成RST 在linux上,当我调用close函数来关闭tcp套接字时,它会从客户机服务器通过fin/ack,套接字也会关闭 但在windows winsock上,每当我调用closesocket时,它总是生成RST消息 我试着用关机电话。它正在生成鳍。但最后我必须调用closesocket,它会发送RST 有没有一种方法可以调用closesocket来释放套接字资源而不发送RST消息。有几种情况会导致closesocket()发送RST而不

Windows套接字关闭(closesocket)函数生成RST

在linux上,当我调用close函数来关闭tcp套接字时,它会从客户机服务器通过fin/ack,套接字也会关闭

但在windows winsock上,每当我调用closesocket时,它总是生成RST消息

我试着用关机电话。它正在生成鳍。但最后我必须调用closesocket,它会发送RST


有没有一种方法可以调用closesocket来释放套接字资源而不发送RST消息。

有几种情况会导致
closesocket()
发送RST而不是FIN:

  • 当套接字接收缓冲区中有未读数据挂起时调用它
  • 在将SO_LINGER选项设置为“on”且超时为零后调用它

  • 如果没有更多的数据要发送和/或接收,可以使用“shutdown()”


    Ex:关闭(clisocket、SD_均关闭)

    在那之前你在做什么?你读过所有输入的数据了吗?你把SO_LINGER弄糊涂了吗?ConnectSocket=socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_协议);iResult=connect(ConnectSocket,ptr->ai_addr,(int)ptr->ai_addrlen);iResult=关机(ConnectSocket,SD_发送);闭合插座(连接插座);WSACleanup();我已经收到了所有的数据。但在我看来,windows套接字从未通过四路FIN/ACK关闭套接字。每当调用ColsSocket或使用SD_调用shutdown时,它总是发送RST。我正在寻找一种在windows套接字上关闭四向FIN/ACK的方法,就像在linux上一样。您不应该在注释中发布代码。把它加到你的问题上。但证据表明你还没有阅读所有的输入数据。在得到零返回之前,您真的
    recv()
    了吗?很抱歉给您带来了困惑。你是对的。我不是在等待recv()返回零。在我的例子中,服务器是源,客户端是接收器。我有一些需要关闭客户端套接字的情况。客户端套接字SO_LINGER设置为(ld.l_onoff=1,ld.l_LINGER=10)。在这种情况下,我使用SD_SEND调用客户机套接字的shutdown,然后调用closesocket。我希望客户端等待10秒读取所有数据,如果没有数据留下,则正常关闭而不发送RST。如果10秒后有任何数据,那么发送RST.Eh?SO_LINGER设置意味着客户端在关闭套接字时将等待10秒发送所有挂起的数据。只有通过SO_RCVTIMEO或
    select()
    ,以及
    recv()
    调用,它才能等待长达10秒的时间来接收数据。无论如何都不会回答问题。