繁体   English   中英

是否阻塞send()立即返回?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM