如何检查在C Linux中是否收到UDP数据包

时间:2016-06-28 09:05:39

标签: c linux sockets server udp

" recvfrom的()"在下面的示例代码中等待直到收到UDP数据包。

但我需要检查UDP数据包是否可用。 如果未收到数据包,则继续执行其他任务。 如果收到数据包,则接收数据包并进行解析。 我怎么能在Linux c程序中这样做?请帮忙!

for (;;) 
{
    printf("waiting on port %d\n", SERVICE_PORT);
    recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen);
    printf("received %d bytes\n", recvlen);
    if (recvlen > 0) {
        buf[recvlen] = 0;
        printf("received message: \"%s\"\n", buf);
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用select函数来了解可以在套接字上读取的内容。

while (1)
{
    int retval;
    fd_set rfds;
    // one second timeout
    struct timeval tv = {1,0};

    FD_ZERO(&rfds);
    FD_SET(fd, &rfds);

    retval = select(1, &rfds, NULL, NULL, &tv);

    if (retval == -1)
    {
        perror("select()");
        exit(1);
    }        
    else if (retval)
    {
        printf("Data is available now.\n");      
    }
    else
    {
        // no data to read... perform other tasks
    }
}

答案 1 :(得分:0)

您可以在代码中等待一些特定的秒数。如果您在该时间内未收到数据包,请要求其进行进一步处理。或者检查recvfrom的返回值以验证收到的数据包大小。