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

时间:2010-11-01 03:56:44

标签: sockets unix udp

我正在使用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上运行相同的客户端服务器时, 它工作正常!!

3 个答案:

答案 0 :(得分:1)

使用SO_REUSEADDR时,

bind()非常有用,但在这里您没有使用bind。

如果recvfrom()返回-1

,我没有看到任何问题

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

答案 1 :(得分:0)

  1. 您的测试无效。 recvfrom()可以返回零,这不表示错误。只有在得到-1时调用perror()才有效。所以你可能根本没有问题..

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

答案 2 :(得分:0)

您是否正在修剪任何其他套接字配置?当您读取非阻塞套接字并且没有可用数据时,通常会返回EAGAIN。 recvfrom的联机帮助页列出了将在失败时设置的可能错误,并对每个错误进行了解释。