【问题标题】:How to check if UDP packet received in C Linux [duplicate]如何检查在C Linux中是否收到UDP数据包[重复]
【发布时间】:2016-10-30 12:24:01
【问题描述】:

下面示例代码中的“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);
    }
}

【问题讨论】:

  • 您可以使用 (select)[linux.die.net/man/2/select] 函数来知道某个内容已准备好在套接字上读取。
  • 是的,选择有效。谢谢。

标签: c linux sockets server udp


【解决方案1】:

您可以使用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
    }
}

【讨论】:

  • 是的,选择有效。谢谢。
【解决方案2】:

您可能会在代码中等待特定的几秒钟。如果您在那段时间内没有收到数据包,请要求它做进一步的处理。或者检查recvfrom的返回值来验证接收到的数据包大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多