SO_REUSEADDR 与 UDP 数据报 - 资源不可用

发布于 2024-09-30 01:24:18 字数 1114 浏览 2 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧时模样 2024-10-07 01:24:18

当您使用bind()时,SO_REUSEADDR很有用,但这里您没有使用bind。

如果 recvfrom() 返回 -1,我没有看到任何问题

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

SO_REUSEADDR is useful when you use bind(), but here you are not using bind.

I dont see any problem if recvfrom() returns -1

Use bind() and replace your call recvfrom() with recv(). recv() will receive all the packets at the port you used in your bind call.

2024-10-07 01:24:18

您是否正在修剪任何其他插座配置?当您读取非阻塞套接字并且没有可用数据时,通常会返回 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.

情绪少女 2024-10-07 01:24:18
  1. 您的测试无效。 recvfrom() 可以返回零,这并不表示出现错误。仅当得到 -1 时调用 perror() 才有效。所以你可能根本没有问题..

  2. 我不明白你为什么在这里使用 SO_REUSEADDR,因为你没有绑定到特定端口。

  1. 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 ..

  2. I don't see why you're using SO_REUSEADDR at all here, as you're not binding to a specific port.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文