【发布时间】:2017-09-30 10:58:30
【问题描述】:
来自man 2 sendto:
成功时,这些调用会返回发送的字节数。出错时,返回 -1,并正确设置 errno。
我是否理解写入所有数据失败不被视为这些函数的失败,因此在写入 UDP 套接字时,send() 函数写入的数据少于请求的数据实际上可能会发生,但是原因errno中未指定此故障的原因?
或者我可以假设send() 将返回-1 并适当地设置errno,或者返回请求发送的字节数?
换句话说:这个错误处理代码是否足够:
if(send(udp_sock_fd, buf, buflen, 0) == -1) {
int err = errno;
fprintf(stderr, "Send failed:\n");
fprintf(stderr, strerror(err));
}
还是有必要这样写:
ssize_t bytes_send = send(udp_sock_fd, buf, buflen, 0);
if(bytes_send == -1) {
int err = errno;
fprintf(stderr, "Send failed:\n");
fprintf(stderr, strerror(err));
} else if(bytes_send < buflen) {
fprintf(stderr, "Incomplete send for unknown reason.\n");
}
【问题讨论】:
-
好问题,我也很好奇。请打任何告诉你“试试看”的人。
-
试试吧。 :)
-
@jnbbender slap ;P 更严肃的一点是,我不确定这有什么帮助,我想我不会引发这种情况,并且再多的失败尝试也无法证明这种情况不会发生。
-
如果数据报协议在应用程序级别被拆分,那么它就没有意义了!