首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有UDP数据报的SO_REUSEADDR -资源不可用

带有UDP数据报的SO_REUSEADDR -资源不可用
EN

Stack Overflow用户
提问于 2010-11-01 03:56:43
回答 3查看 4K关注 0票数 1

我正在使用SO_REUSEADDR选项,但我不知道为什么要获得资源临时不可更改选项。

我正在127.0.0.1上测试客户端服务器代码

代码语言:javascript
复制
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上运行相同的客户机服务器时,它可以正常工作!!

EN

回答 3

Stack Overflow用户

发布于 2010-11-01 05:13:15

SO_REUSEADDR在使用bind()时很有用,但是这里没有使用bind。

如果recvfrom()返回-1,我看不出任何问题

使用bind()并将调用recvfrom()替换为recv()recv()将在绑定调用中使用的端口接收所有数据包。

票数 1
EN

Stack Overflow用户

发布于 2010-11-01 04:03:53

  1. 您的测试无效。recvfrom()可以返回零,这并不表示错误。只有当您得到-1时,调用perror()才有效。
  2. 我不明白为什么在这里使用SO_REUSEADDR,因为您没有绑定到特定的端口.
票数 0
EN

Stack Overflow用户

发布于 2010-11-01 04:19:52

您是否正在修剪其他套接字配置?当读取非阻塞套接字且没有可用数据时,通常会返回EAGAIN。recvfrom的手册列出了失败时可能设置的errnos,并给出了每个错误的说明。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4066549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档