我正在使用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;
}
}
错误讯息: “client:recvfrom()失败:资源暂时不可用”
错误号:11
在尝试运行客户端3-4次之后,我得到了数据,我不确定是什么时候发生的。
此问题出在Ubuntu Linux上,但是当我在Solaris上运行相同的客户端服务器时, 它工作正常!!
答案 0 :(得分:1)
SO_REUSEADDR
时, bind()
非常有用,但在这里您没有使用bind。
如果recvfrom()
返回-1
使用bind()
并将来电recvfrom()
替换为recv()
。 recv()
将收到您在绑定调用中使用的端口上的所有数据包。
答案 1 :(得分:0)
您的测试无效。 recvfrom()可以返回零,这不表示错误。只有在得到-1时调用perror()才有效。所以你可能根本没有问题..
我不明白为什么你在这里使用SO_REUSEADDR,因为你没有绑定到特定的端口。
答案 2 :(得分:0)
您是否正在修剪任何其他套接字配置?当您读取非阻塞套接字并且没有可用数据时,通常会返回EAGAIN。 recvfrom的联机帮助页列出了将在失败时设置的可能错误,并对每个错误进行了解释。