gpt4 book ai didi

c++ - shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久

转载 作者:太空宇宙 更新时间:2023-11-04 02:27:55 25 4
gpt4 key购买 nike

我使用 WinAPI 为套接字操作编写了 C++ 服务。客户端和服务之间的通信很简单,连接到服务后,客户端发送一些数据,服务立即发送响应。

服务端的主套接字(ListenSocket)是这样创建的:

SOCKET ListenSocket = socket(pAddrResult->ai_family, pAddrResult->ai_socktype, pAddrResult->ai_protocol);
/* err checking */
/* Setting socket I/O mode to non-blocking */
u_long nonBlockingMode = 1;
opResult = ioctlsocket(ListenSocket, FIONBIO, &nonBlockingMode);
/* err checking */

主套接字上的选择-接受循环:

while(...)
{
if(select(0, &readSet, NULL, NULL, &timeout) == 1)
{
ClientSocket = accept(ListenSocket, NULL, NULL); // SOCKET type, declared in global scope.
/* err checking */
break;
}
}

中断循环后,服务开始从 ClientSocket 读取数据,然后服务在此套接字上发送响应:

 int iSendResult = send(ClientSocket, (const char*) messageBuffer.getData(), messageBuffer.getSize(), 0);
/* err checking */
/* FIX sleep(50) */
int opResult = shutdown(ClientSocket, SD_BOTH);
/* err checking */
closesocket(ClientSocket);

closesocket() 过程返回到 select-accept 循环并等待另一个连接。

我的问题是,有时客户端收到的数据不足,并收到“连接已被远程主机关闭”的信息。经过调试和一些研究后,我在 MSDN 上发现了这个注释:

Using the closesocket or shutdown functions with SD_SEND or SD_BOTH results in a RELEASE signal being sent out on the control channel. Due to ATM's use of separate signal and data channels, it is possible that a RELEASE signal could reach the remote end before the last of the data reaches its destination, resulting in a loss of that data. One possible solutions is programming a sufficient delay between the last data sent and the closesocket or shutdown function calls for an ATM socket.

延迟你说微软? :( 好吧,我已经实现了短延迟 (/* FIX sleep(50) */),问题消失了。

但这一点都不让我满意。我想删除这个 sleep() 并确保缓冲区在发送后被完全刷新并且我可以安全地 shutdown()closesocket().

我试图让主套接字成为非阻塞的,希望 send() 会阻塞直到完成,但我错了 - 没有效果。

如果没有 sleep(),我还能做些什么吗?

最佳答案

通常的方法是一个部分只发出一个 SD_SEND 关闭,然后对等点将以 0 长度读取结束并且能够关闭,因为通信 channel 上仍然没有任何东西。可以在其他 answer 上找到带有一些引用的稍微更详细的解释。我的。

关于c++ - shutdown() 和 closesocket() 在 SOCKET 上的 send() 之后不久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com