立即阻塞 send() returns 吗?

Does a blocking send() returns immediately?

我认为在阻塞套接字上调用 send() 不会 return 直到所有数据都被发送(直到最后一个数据块被发送到发送缓冲区),但是下面测试显示否则:

// buffer = "AAAAAAAA...B" (10 MB)
char *buffer = new char[10485760];
memset(buffer, 0x41, 10485760);
buffer[10485758] = 0x42;
buffer[10485759] = '[=11=]';

// Send buffer
send(s, buffer, 10485760, 0) ;

printf("send() has returned");

所以基本上我连接到 Netcat 并发送 buffer,甚至在 send() 已经 returned 之后,AAAAAAAAAAAAAA... 仍然显示在另一台控制台上结尾。您可以随时关闭发送器,发送将停止(所以不是buffer已经到达另一端,而是需要很长时间才能显示到控制台)。

这只有在发送缓冲区超过 10 MB 时才有意义。

编辑: send() 的 return 值为 10485760(即 buffer 大小)。

send 将数据发送到内核,并将其放置在套接字缓冲区中。如果内核用完套接字缓冲区,send 将阻塞(或失败,如果它是非阻塞的)。

这与内核向网络发送数据关系不大。

但是,如果您终止一个程序,它的所有套接字都会被强制关闭,这将丢弃内核缓冲区中所有未发送的数据。