Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对于UDP套接字,发送函数不';t失败,但写入的数据仍然少于请求的数据?_C_Sockets_Udp_Posix_Send - Fatal编程技术网

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更严重的是,我不确定它有什么帮助,我不认为我能引发这样的情况,并且任何失败的尝试都不会证明这种情况不会发生。如果数据报协议在应用程序级别被拆分,那么使用它是没有意义的!