C 对于UDP套接字,发送函数不';t失败,但写入的数据仍然少于请求的数据?
从C 对于UDP套接字,发送函数不';t失败,但写入的数据仍然少于请求的数据?,c,sockets,udp,posix,send,C,Sockets,Udp,Posix,Send,从人工2发送到: 成功时,这些调用返回发送的字节数。在出现错误时,返回-1,并正确设置errno 据我所知,写入所有数据的失败并不被视为这些函数的失败,因此在写入UDP套接字时,send() 或者我可以假定send()将返回-1并适当设置errno,或者返回请求发送的字节数吗 换句话说:此错误处理代码是否足够: if(send(udp_sock_fd, buf, buflen, 0) == -1) { int err = errno; fprintf(stderr, "Send fail
人工2发送到:
成功时,这些调用返回发送的字节数。在出现错误时,返回-1,并正确设置errno
据我所知,写入所有数据的失败并不被视为这些函数的失败,因此在写入UDP套接字时,send()
或者我可以假定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");
}
ssize\u t bytes\u send=send(udp\u sock\u fd,buf,buflen,0);
如果(字节数_send==-1){
int err=errno;
fprintf(stderr,“发送失败:\n”);
fprintf(标准差、标准差);
}else if(发送字节数
没有只发送部分数据报的概念。它要么全部消失,要么一个也没有消失。操作系统或网络驱动程序不会为您拆分数据报。返回发送的字符数必须是一种礼貌,以便与其他send
API函数保持一致
另请参见手册页:
对于sendto()
,如果消息太长,无法通过基础协议原子地传递,则返回错误EMSGSIZE
,并且不传输消息
显然,@Paul Bentley已经给出了正确的答案,但如果您担心——尽管这永远不会发生——可能会出现一些罕见的错误情况,那么请注意,至少对于特定的实现(Linux),net/ipv4/udp.c
中的udp_sendmsg
(这是udp套接字上的send
的最终调用)的代码只有一个可以返回非负值的出口,它返回调用者提供的长度:
int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
{
... code that doesn't modify len ...
out:
...
if (!err)
return len;
...
}
好问题,我也很好奇。请打任何叫你“试试看”的人。试试看。:)@一记耳光;P更严重的是,我不确定它有什么帮助,我不认为我能引发这样的情况,并且任何失败的尝试都不会证明这种情况不会发生。如果数据报协议在应用程序级别被拆分,那么使用它是没有意义的!