我正在使用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() failed:资源暂时不可用”
错误:11
在尝试运行客户端3-4次之后,我得到了数据,我不知道发生了什么。
也存在这个问题,但是当我在Solaris上运行相同的客户机服务器时,它可以正常工作!!
发布于 2010-11-01 05:13:15
SO_REUSEADDR在使用bind()时很有用,但是这里没有使用bind。
如果recvfrom()返回-1,我看不出任何问题
使用bind()并将调用recvfrom()替换为recv()。recv()将在绑定调用中使用的端口接收所有数据包。
发布于 2010-11-01 04:03:53
发布于 2010-11-01 04:19:52
您是否正在修剪其他套接字配置?当读取非阻塞套接字且没有可用数据时,通常会返回EAGAIN。recvfrom的手册列出了失败时可能设置的errnos,并给出了每个错误的说明。
https://stackoverflow.com/questions/4066549
复制相似问题