gpt4 book ai didi

sockets - UDP在多个端口接收数据

转载 作者:行者123 更新时间:2023-12-02 20:08:26 25 4
gpt4 key购买 nike

是否可以通过recvfrom在2个端口上接收数据?我有一个用于用户请求的端口和另一个用于聊天消息的端口。是否可以绑定(bind)两个具有不同端口的套​​接字并使用一个recvfrom()接收数据?

问候

编辑这段代码有效吗?

int socket_fd,socket_fd2;
struct sockaddr_in addr, chat_addr;

addr.sin_family = AF_INET;
addr.sin_port = htons(1234);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

chat_addr.sin_family = AF_INET;
chat_addr.sin_port = htons(4321);
chat_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

bind(socket_fd2, (struct sockaddr *) &chat_addr, sizeof(struct sockaddr_in));
bind(socket_fd, (struct sockaddr *) &addr, sizeof(struct sockaddr_in));

所以我想在两个不同的端口上接收数据。

最佳答案

不,不可能使用对 recvfrom 的单次调用从两个套接字读取数据,因为该函数仅采用单个套接字文件描述符参数。

您要么需要每个端口一个线程,要么需要一种机制(例如 selectpoll)来告知哪些套接字有数据等待读取。

在后一种情况下,一旦您知道哪些套接字有待处理的数据,您就可以然后在该特定套接字上调用recvfrom来获取您需要的数据,例如:

// set up select parameters
fd_set socks;
FD_ZERO(&socks);
FD_SET(socket_fd, &socks);
FD_SET(socket_fd2, &socks);

// find out which sockets are read - NB: it might be both!
int nsocks = max(socket_fd, socket_fd2) + 1;
if (select(nsocks, &socks, (fd_set *)0, (fd_set *)0, 0) >= 0) {
if (FD_ISSET(socket_fd, &socks)) {
// handle socket 1
recvfrom(socket_fd, ...);
}
if (FD_ISSET(socket_fd2, &socks)) {
// handle socket 2
recvfrom(socket_fd2, ...);
}
}

注意:这只是一个粗略且准备好的示例 - 真实的代码会有错误检查等。

关于sockets - UDP在多个端口接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10687323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com