是否有任何 C 套接字函数可以从特定的 UDP 客户端查找数据报?
Is there any C socket function, which can look for datagrams from a specific UDP client?
我搭建的服务器使用的是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;
}
}
}
如果不是,我还有其他选择吗?
您可以创建一个单独的 UDP 套接字,该套接字 bind()
到本地 IP/Port 并 connect()
到特定客户端 IP/Port,然后您可以recv()
使用该套接字,它将只为您提供来自该客户端的数据报。
我搭建的服务器使用的是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;
}
}
}
如果不是,我还有其他选择吗?
您可以创建一个单独的 UDP 套接字,该套接字 bind()
到本地 IP/Port 并 connect()
到特定客户端 IP/Port,然后您可以recv()
使用该套接字,它将只为您提供来自该客户端的数据报。