SO_REUSEADDR 与 UDP 数据报 - 资源不可用
我正在使用 SO_REUSEADDR 选项,但我不确定为什么会这样 资源选项暂时不可用。
我正在 127.0.0.1 上测试客户端服务器代码
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
{
perror("socket() error!!\n");
exit(1);
}
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 ) {
perror("SO_REUSEADDR failed::");
exit(1);
}
while(1) {
nbytes_read = recvfrom(sockfd, (void *)&recvd_msg, sizeof(recvd_msg),
flags, &from, &from_len);
printf("nbytes_read = %d\n", nbytes_read);
if(nbytes_read == -1) {
perror("client: recvfrom() failed");
return FAILED;
}
if (nbytes_read > 0) {
if(recvd_msg.hdr.msgtype == DATA)
printf("recvd %d bytes from server\n", recvd_msg.hdr.payload_size);
ftp_show_payload(&recvd_msg);
}
if(recvd_msg.hdr.is_last == TRUE) {
break;
}
}
错误消息: “客户端:recvfrom()失败:资源暂时不可用”
errno:11
尝试运行客户端3-4次后,我得到了数据,我不确定发生了什么。
此外,这个问题出现在 Ubuntu Linux 上,但是当我在 Solaris 上运行相同的客户端服务器时, 效果很好!!
I'm using SO_REUSEADDR option, but I'm not sure why am getting
Resource temporary unvailable option.
I'm testing client server code on 127.0.0.1
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
{
perror("socket() error!!\n");
exit(1);
}
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 ) {
perror("SO_REUSEADDR failed::");
exit(1);
}
while(1) {
nbytes_read = recvfrom(sockfd, (void *)&recvd_msg, sizeof(recvd_msg),
flags, &from, &from_len);
printf("nbytes_read = %d\n", nbytes_read);
if(nbytes_read == -1) {
perror("client: recvfrom() failed");
return FAILED;
}
if (nbytes_read > 0) {
if(recvd_msg.hdr.msgtype == DATA)
printf("recvd %d bytes from server\n", recvd_msg.hdr.payload_size);
ftp_show_payload(&recvd_msg);
}
if(recvd_msg.hdr.is_last == TRUE) {
break;
}
}
Error message:
" client: recvfrom() failed: Resource temporarily unavailable"
errno:11
After trying to run client for 3-4 times, I get the data, I'm not sure whats happening.
Also, this problem is on Ubuntu Linux, but when I run the same client server on Solaris,
it works fine!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当您使用bind()时,SO_REUSEADDR很有用,但这里您没有使用bind。
如果
recvfrom()
返回-1
,我没有看到任何问题使用
bind()
并替换您的调用recvfrom()
与recv()
。recv()
将在您在绑定调用中使用的端口接收所有数据包。SO_REUSEADDR
is useful when you usebind()
, but here you are not using bind.I dont see any problem if
recvfrom()
returns-1
Use
bind()
and replace your callrecvfrom()
withrecv()
.recv()
will receive all the packets at the port you used in your bind call.您是否正在修剪任何其他插座配置?当您读取非阻塞套接字并且没有可用数据时,通常会返回 EAGAIN。 recvfrom 的联机帮助页列出了失败时可能设置的错误号以及每个错误的解释。
Are you trimming out any other socket configuration? EAGAIN is typically returned when you read a non-blocking socket and there's no data available. The manpage for recvfrom lists the possible errnos that will be set on failure with an explanation for each one.
您的测试无效。 recvfrom() 可以返回零,这并不表示出现错误。仅当得到 -1 时调用 perror() 才有效。所以你可能根本没有问题..
我不明白你为什么在这里使用 SO_REUSEADDR,因为你没有绑定到特定端口。
Your test is invalid. recvfrom() can return zero, which doesn't indicate an error. It is only valid to call perror() if you get -1. So you may not have a problem at all ..
I don't see why you're using SO_REUSEADDR at all here, as you're not binding to a specific port.