关闭套接字而不等待发送成功-Winsock2非阻塞TCP套接字
Close socket without waiting for send to succeeed - Winsock2 non-blocking TCP socket
我通过封装Winsock2 API的套接字库使用非阻塞套接字。WSAAsyncSelect()
函数用于将套接字通知发送到窗口。(应用程序是单线程的)。
我正在努力实现以下开放式客户端套接字的目标:
- 向服务器发送最后一条消息
- 关上插座并毁坏窗户
我不想阻塞等待服务器ACK
我的最后一条消息,因为这会给我的代码用户带来另一个延迟/失败点。这对我的协议来说不是一个重要的信息,只是一个很好的信息。
目前,我的代码最终调用Winsock2send()
来发送最终消息,然后调用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。你必须对此做出决定。要么它在协议中,要么它不在。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- Winsock2 select():同一个套接字上可能有多个事件吗?
- 套接字错误 gcc 无法在 WinSock2.h 中获取函数
- C#异步套接字与C++winsock2之间的通信
- C++ 异步套接字(System.Net.Sockets.Socket.BeginAccept)与WinSock2.h
- Winsock2 无法绑定套接字
- 如何在WinSock2中的DGRAM套接字上获取传入数据包的IP地址
- 关闭套接字而不等待发送成功-Winsock2非阻塞TCP套接字
- 套接字错误无法获取 WinSock2.h 中的函数