【发布时间】:2012-07-14 12:34:18
【问题描述】:
我正在为我的应用程序使用 Windows 套接字 (winsock2.h)。由于阻塞套接字不允许我控制连接超时,因此我使用的是非阻塞套接字。在发送命令之后,我正在使用关闭命令进行刷新(我必须)。我的超时时间是 50 毫秒,我想知道的是,如果要发送的数据这么大,是否存在只发送一部分数据或什么都不发送的风险?提前谢谢...
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
u_long iMode=1;
ioctlsocket(hSocket,FIONBIO,&iMode);
connect(hSocket, (sockaddr*)(&sockAddr),sockAddrSize);
send(hSocket, sendbuf, sendlen, 0);
shutdown(hSocket, SD_BOTH);
Sleep(50);
closesocket(hSocket);
【问题讨论】:
-
嗯,我很确定连接超时在阻塞套接字时也能正常工作——我一直在客户端线程中这样做——如果断开连接,它们会循环一次 connect() 尝试并睡眠(2000),不断重试连接,直到成功。无论如何,连接超时与连接()成功后的套接字写入无关,所以我假设您的意思是一种写入超时形式?如果是这样,我从来没有尝试过这样的事情——我不使用连接/断开协议,(除了浏览器/HTTP!),因为性能很差,(尤其是在高延迟链接上)。
-
您可以使用 select() 使阻塞模式连接超时。您不必调用 shutdown() 来刷新。 TCl 不会丢失数据,否则 Internet 将无法工作,例如这个论坛,亚马逊,谷歌等。你的问题是基于错误的前提。
-
您正在“选择”套接字状态并检查是否断开连接?我想尽可能快地发送数据。另外两种可能的情况是:服务器等待太长时间以接受连接或接收。所以连接和写入都应该在最多 50 毫秒内完成,因为在我的情况下时间非常重要。我必须刷新写入和读取流,因为服务器不断向我发送不必要的大数据并且我的互联网连接有限。实际上我什至不想要来自服务器的单个字节:)
-
@EJP 通过从另一个线程检查?因此,假设套接字在连接线中被阻塞。如果另一个线程在超时时关闭了套接字,那么该块是否被释放?
-
@GunDenizAkkoc 是的,是的,但即使您使用非阻塞连接,也没有什么说您必须保持非阻塞模式才能接收。当您关闭关闭时,关闭是 100% 冗余的,同上睡眠。
标签: c++ sockets tcp nonblocking flush