【发布时间】:2010-11-01 03:56:43
【问题描述】:
我正在使用 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() 失败:资源暂时不可用”
错误号:11
尝试运行客户端 3-4 次后,我得到了数据,我不确定发生了什么。
另外,这个问题出现在 Ubuntu Linux 上,但是当我在 Solaris 上运行相同的客户端服务器时, 它工作正常!
【问题讨论】:
-
您不需要标签或 goto。使用继续。而且你只能在非阻塞模式下获得零,在这种情况下你应该选择(),而不仅仅是旋转。 'return'之后你不需要'else'。
-
好的,我已经改变了你所说的一切,但我仍然不确定为什么我得到 EAGAIN(资源不可用)..
-
不,你没有。如果你得到 EAGAIN,你必须处于非阻塞模式,所以你需要调用 select() 来告诉你数据何时可用。
-
要处于非阻塞模式,我认为我们需要设置 O_NONBLOCK,但在我的代码中,我没有这样做
-
好的,那么你删除了无意义的 SO_REUSEADDR 了吗?