Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
在UDP套接字的情况下,为什么后续recvfrom()调用被阻塞_C_Linux_Sockets_Io - Fatal编程技术网

在UDP套接字的情况下,为什么后续recvfrom()调用被阻塞

在UDP套接字的情况下,为什么后续recvfrom()调用被阻塞,c,linux,sockets,io,C,Linux,Sockets,Io,在简单的客户机-服务器程序中,客户机正在发送12字节的数据。我正在使用recvfrom(),在连续调用中请求2和10个字节。在第一次调用的情况下,recvfrom()返回2个字节。但第二个呼叫是阻塞。为什么会这样?我认为TCP套接字不会发生这种情况,连续的读取调用返回可用字节(这里是10) 具有以下相关信息(粗体添加): 对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参

在简单的客户机-服务器程序中,客户机正在发送12字节的数据。我正在使用recvfrom(),在连续调用中请求2和10个字节。在第一次调用的情况下,recvfrom()返回2个字节。但第二个呼叫是阻塞。为什么会这样?我认为TCP套接字不会发生这种情况,连续的读取调用返回可用字节(这里是10)

具有以下相关信息(粗体添加):

对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参数中未设置MSG_PEEK,多余的字节将被丢弃

您需要在一次通话中阅读它。

包含以下相关信息(粗体添加):

对于基于消息的套接字,如SOCK_RAW、SOCK_DGRAM和SOCK_SEQPACKET,应在一次操作中读取整个消息。如果消息太长,无法放入提供的缓冲区,并且在flags参数中未设置MSG_PEEK,多余的字节将被丢弃


您需要在一次调用中读取它。

我认为您对recvfrom函数的第三个(
len
)参数感到困惑

ssize_t recvfrom(int s, void *buf, size_t len, int flags,
                 struct sockaddr *from, socklen_t *fromlen);
后者表示缓冲区(
void*buf
)有多大,而不是要从数据包中提取多少字节

UDP
类型套接字中,您必须读取另一个对等方发送给您的整个数据包(
UDP
确保它不会碎片化),并避免重复读取发送的数据,就像
TCP
模式一样


在您的情况下,如果您的缓冲区是2个字节,那么其他10个字节将被丢弃(请参阅
recvfrom
手册页)

我认为您对recvfrom函数的第三个(
len
)参数感到困惑

ssize_t recvfrom(int s, void *buf, size_t len, int flags,
                 struct sockaddr *from, socklen_t *fromlen);
后者表示缓冲区(
void*buf
)有多大,而不是要从数据包中提取多少字节

UDP
类型套接字中,您必须读取另一个对等方发送给您的整个数据包(
UDP
确保它不会碎片化),并避免重复读取发送的数据,就像
TCP
模式一样

在您的情况下,如果缓冲区是2个字节,那么其他10个字节将被丢弃(查看
recvfrom
手册页)