gpt4 book ai didi

c++ - 非阻塞 TCP 套接字并在发送后立即刷新?

转载 作者:可可西里 更新时间:2023-11-01 02:44:12 30 4
gpt4 key购买 nike

我正在为我的应用程序 (winsock2.h) 使用 Windows 套接字。由于阻塞套接字不允许我控制连接超时,因此我使用的是非阻塞套接字。发送命令后,我正在使用关闭命令进行刷新(我必须这样做)。我的超时时间是 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);

最佳答案

Non-blocking TCP socket and flushing right after send?

没有刷新 TCP 套接字这样的事情。

Since the blocking socket doesn't let me control connection timeout

错了。您可以在阻塞套接字上使用 select()

I am using non-blocking one.

不合逻辑。

Right after send command I am using shutdown command to flush(I have to).

您不必这样做,shutdown() 不会刷新任何内容。

My timeout is 50ms

为什么?发送数据的时间取决于数据的大小。明显地。对发送使用固定超时没有任何意义。

and the thing I want to know is if the data to be sent is so big, is there a risk of sending only a portion of data or sending nothing at all?

在阻塞模式下,如果可能,将发送您提供给send() 的所有数据。在非阻塞模式下,如果可能,将发送 send() 的返回值表示的数据量。在任何一种情况下,如果发送失败,连接将被重置。无论您叠加什么超时机制都不可能改变任何一个:具体来说,在超时后异步关闭套接字只会导致关闭附加到正在发送的数据。它不会导致发送被中止。

您的代码不会通过任何已知的代码审查。零错误检查; sleep 完全没有意义;关闭前关闭是多余的。如果 sleep 旨在实现超时,则不会。

I want to be sending data as fast as possible.

你不能。 TCP 实现流量控制。你对此无能为力。您受到接收方的速率限制。

Also the 2 possible cases are: server waits too long to accept connection

没有这种情况。客户端可以在服务器调用 accept() 之前完成连接。 如果您尝试实现比默认值大约一分钟更短的连接超时,请使用 select()。

or receive.

对此你无能为力:见上文。

So both connecting and writing should be done in max of 50ms since the time is very important in my situation.

见上文。为需要可变时间的操作实现固定超时没有意义。 50 毫秒对于连接超时来说太短了。如果这是一个真正的问题,您应该保持连接打开,以便连接延迟只发生一次:事实上,您应该尽可能长时间地保持 TCP 连接打开。

I have to flush both write and read streams

你不能。 TCP 中没有刷新读取流或写入流的操作。

because the server keeps sending me unnecessarly big data and I have limited internet connection.

另一个不合逻辑。如果服务器向您发送数据,您必须读取它,否则您将停止服务器,这与刷新您自己的写入流没有任何关系。

Actually I don't even want a single byte from the server

运气不好。你必须阅读它。 [如果你在 BSD Unix 上,你可以关闭输入套接字,这会导致服务器的数据被丢弃,但这在 Windows 上不起作用:它会导致服务器重置连接。]

关于c++ - 非阻塞 TCP 套接字并在发送后立即刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11491147/

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