C语言 选择()不起作用



我需要实现一个服务器代码,该代码接收一定长度的表达式并将从客户端接收它,并且它最多应该等待 500 毫秒,如下所示:

"当服务器收到长度消息时,它将等待长达 500 毫秒才能发送该字节数。

该程序由一个简单的UDP服务器 - 客户端程序组成,其中客户端发送表达式并服务器处理它。我使用 sendto()recvfrom() 分别在客户端/服务器之间发送数据。这段代码应该在 unix 机器上运行。我看到一个类似的问题,有同样的问题,它解决了,但不适合我。我已经将代码更改为与 recvfrom() 系统调用更相似,但它仍然不起作用。有人能猜出为什么它不起作用吗?

ssize_t timeout_recvfrom(int sock, void *restrict buf, size_t length, int flags,
                         struct sockaddr_in *restrict connection, socklen_t *restrict len, float timeout){
fd_set socks;
    struct timeval t;
    FD_ZERO(&socks);
    FD_SET(sock, &socks);
    t.tv_sec = timeout;
    int aux = select(sock + 1, &socks, NULL, NULL, &t);
    long recvlen = recvfrom(sock, buf, length, 0, (struct sockaddr *) connection, len);
    if (aux && recvlen != -1) {
        return recvlen;
    }
    else {
        printf("select value: %d and recvlen: %lun",aux,recvlen);
        perror("cannot select()");
        return 0;
    }
}

服务器以这种方式调用此函数:

//recvlen = recvfrom(fd, buf, sizeof(buf) - 1, 0, NULL, 0);
recvlen = timeout_recvfrom(fd, buf, sizeof(buf) - 1, 0, NULL, 0, 0.5);

注释版本有效,另一个无效,它输出:

select value: 0 and recvlen: 5
cannot select(): Undefined error: 0
Received 0 bytes
Received message: ""
Invalid term: `(null)'

recvlen()应该有一个 5 的值,我想aux不应该是 0。

选择的调用返回 0,这意味着超时已过期。您不初始化超时的微秒部分,并且由于您以 0.5 作为超时调用函数,因此秒部分的秒部分被初始化为 0(微秒部分可能是垃圾)。–艺术

相关内容

  • 没有找到相关文章

最新更新