据推测,内核将无法立即发送所有send数据,这就是为什么成功时返回发送的字节数。重要的是返回的数字可以(并且很可能)小于调用中指定的总长度。仅当根本无法发送任何字节时,您才会得到EAGAIN/EWOULDBLOCK答案。因此,当发送大量数据时,您只需要正确处理(很可能)并非一次发送所有数据的可能性。
注意:这对于数据报 (UDP) 套接字有所不同,因为无法发送部分数据报。有关详细信息,请参阅POSIX:UDP 套接字上的 write() 返回值。
下面是一个假设 (TCP) 套接字的示例SOCK_STREAM:
size_t len;
size_t sent;
char *buf;
/* ... prepare data ... */
while (sent < len) {
ssize_t n;
if ((n = send(sockfd, buf + sent, len - sent, flags)) == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK)
continue;
perror("send failed");
exit(1);
}
sent += n;
}
Run Code Online (Sandbox Code Playgroud)