繁体   English   中英

关闭套接字而无需等待发送到成功-Winsock2非阻塞TCP套接字

[英]Close socket without waiting for send to succeeed - Winsock2 non-blocking TCP socket

我通过包装Winsock2 API的套接字库使用非阻塞套接字。 WSAAsyncSelect()函数用于将套接字通知发送到窗口。 (该应用程序是单线程的)。

我正在尝试实现开放客户端套接字的以下目标:

  • 向服务器发送最终消息
  • 关闭插座并破坏窗户

我不想为服务器做一个阻塞等待ACK我的最后一条消息,因为这带来了延迟/失败的另一点我的代码的用户。 这对我的协议不是至关重要的信息,只是一个很好的信息。

当前,我的代码最终调用Winsock2 send()发送最终消息,然后调用closesocket() 但是,我的TCP流(如Wireshark所见)如下所示:

// Calling send():
Me -> Host:  [PSH, ACK] 

// Calling closesocket():
Me -> Host:  [FIN, ACK] 

// Just after that:
Host -> Me:  [ACK]    
Host -> Me:  [ACK]
Host -> Me:  [ACK] Len=1380   // A response to my sent packet, that I don't care about
Me -> Host:  [RST, ACK]
Host -> Me:  [RST]
Host -> Me:  [PSH, ACK]  // Retransmission of that response
Me -> Host:  [RST]

因此,Windows发送了两个RST请求。 我认为这是因为套接字在发送FIN之后收到一条消息,因此它决定RST是必需的,但随后主机将其解释为重传请求。

如果我将代码更改为稍等一会儿再调用closesocket ,则跟踪看起来会非常不同:我的一端只发送了[FIN, ACK] ,另一端又发送了[FIN, ACK] ,并且没有RST。

我的问题是:如何整齐地关闭套接字(即避免RST交换)而不必阻塞?

我不想阻塞等待服务器确认我的最后一条消息,因为这给我的代码用户带来了另一点延迟/失败。 这对我的协议不是至关重要的信息,只是一个很好的信息。

我假设您正在谈论应用程序级ACK。 如果您在未读取的数据到达之前将其关闭,则该数据会向发送者触发RST。 您必须对此做出决定。 要么在协议中,要么不在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM