![](/img/trans.png)
[英]Is there any reason for a blocking call to winsock send() function on Vista to return immediately?
[英]Does a blocking send() returns immediately?
我认为在send()
完所有数据之前(直到最后一个数据块发送到发送缓冲区为止send()
在阻塞套接字上调用send()
不会返回,但是以下测试显示了其他情况:
// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '\0';
// Send buffer
send(s, buffer, 10485760, 0) ;
printf("send() has returned");
因此,基本上我连接到Netcat并发送了buffer
,即使在send()
返回之后, AAAAAAAAAAAAAA...
仍然在另一端的控制台上显示。 您可以随时关闭发送方,发送将会停止(因此buffer
不是已经到达另一端,而是需要很长时间才能将其显示在控制台上)。
仅当发送缓冲区为10+ MB时才有意义。
编辑: send()
的返回值为10485760
(即buffer
大小)。
send
将数据发送到内核,并将其放置在套接字缓冲区中。 如果内核用尽了套接字缓冲区,则send
将阻塞(如果未阻塞,则send
失败)。
这与内核向网络发送数据几乎没有关系。
但是,如果您杀死程序,则该程序的所有套接字都将被强制关闭,这将丢弃内核缓冲区中所有未发送的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.