首页 > 解决方案 > 是否有任何 C 套接字函数可以查找来自特定 UDP 客户端的数据报?

问题描述

我正在构建的服务器使用 UDP 传输层协议。我有一个场景,多个客户端可以将数据报发送到我的服务器。但是每个客户端可能会跨多个数据报发送数据,在开始处理数据之前,我需要在服务器上拥有整个数据。从手册页recvfrom()看,它听起来像是从任何 UDP 客户端读取数据报。是否有任何recv*()家庭功能使我们能够从特定的 UDP 客户端读取?

#include <netinet/in.h>
#include <sys/socket.h>

int append_data(void* buf, int size);

int main()
{
    /* Create a UDP socket and bind to a port */
    int sockfd;
    char rd_buf[100];

    struct sockaddr_in cliaddr;

    for ( ; ; ) {
        /* Recvfrom any client */

        int addr_len = sizeof(cliaddr);
        int rd_status = recvfrom(sockfd, rd_buf, sizeof(rd_buf), 0, (struct sockaddr*) &cliaddr, &addr_len);

        if (append_data(rd_buf, rd_status) == DATA_COMPLETE)
            continue;

        /* Recvfrom a particular client */

        for ( ; ; ) {
            /* Any function similar to recvfromcli() ? */

            int rd_status = recvfromcli(sockfd, rd_buf, sizeof(rd_buf), 0, (struct sockaddr*) &cliaddr, addr_len);

            if (append_data(rd_buf, rd_status) == DATA_COMPLETE)
                 break;
        }
    }
}

如果不是,我的其他选择是什么?

标签: csocketsnetwork-programmingudprecvfrom

解决方案


您可以创建一个单独的 UDP 套接字,该套接字bind()连接到本地 IP/端口并connect()连接到特定的客户端 IP/端口,然后您可以recv()使用该套接字,它只会为您提供来自该客户端的数据报。


推荐阅读