Select()不工作

Select()不工作,c,sockets,unix,time,timeout,C,Sockets,Unix,Time,Timeout,我需要实现一个服务器代码,该代码接收表达式的长度,并将从客户端接收该长度,它应该等待500毫秒,如下所述: “当服务器收到长度消息时,它将等待500毫秒,等待发送该字节数。” 该程序由一个简单的UDP服务器客户端程序组成,客户端发送一个表达式,服务器进行处理。我分别使用sendto()和recvfrom()在客户机/服务器之间发送数据。 这段代码应该在unix机器上运行。我看到了一个类似的有着同样问题的,它被解决了,但不是为我。我已经将代码更改为与recvfrom()系统调用更为相似,但是它仍然

我需要实现一个服务器代码,该代码接收表达式的长度,并将从客户端接收该长度,它应该等待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: %lu\n",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。

您对select的调用返回了0,这意味着超时已过期。您不初始化超时的微秒部分,因为您使用0.5作为超时调用函数,所以秒部分的秒部分被初始化为0(微秒部分可能是垃圾)。-Art

您对select的调用返回0,这意味着超时已过期。您不初始化超时的微秒部分,因为您以0.5作为超时来调用函数,所以秒部分的秒部分被初始化为0(微秒部分可能是垃圾)。不要在产生错误的函数调用和
peror()之间
printf()
。不要在产生错误的函数调用和perror()之间喘息。您可能会错过产生错误的函数。perror打印errno的值,该值可以在瞬间更改。@Ryker这不是小点,这是点!timeval未正确初始化,浮点值错误地用于设置整数类型。OP:如果选择失败,您也不应该尝试调用receive。。。你的代码逻辑被破坏了。