gpt4 book ai didi

c - 了解用于接收 UDP 消息和打开 TCP 套接字的选择循环

转载 作者:可可西里 更新时间:2023-11-01 02:39:55 26 4
gpt4 key购买 nike

您好,我正在为一个网络类项目工作,我们在网络中创建节点,通过 udp 从控制应用程序接收消息,然后创建与其他节点的 tcp 连接。基本顺序是:1) 控制管理器向节点 A 发送 udp 消息,告诉它连接到节点 B 2) 节点 A 接收 udp 消息并将 udp 消息转发给节点 B 3) 节点 B 接收 udp 消息,随机选择一个端口号,在该端口上打开一个监听的 tcp 套接字,并使用端口号将 udp 消息发送回 A 4) 节点 A 接收到 udp 消息并在该 tcp 端口上打开到节点 B 的连接。

基本上,我想循环接收到的 udp 消息并跳转到我的消息解析函数,同时循环 tcp 连接。那部分看起来很简单,但我真的不明白如何将监听套接字添加到文件描述符列表中。下面的代码是我放在一起的,我想知道基本结构是否正确?我真的不明白如何创建监听 tcp 套接字并将其添加到 fd 列表?

SOCKET udpsock;
udpsock = initudp(port); //setup udp socket
SOCKET tcpsock;
FD_ZERO(&rdsocks);

max = udpsock + 1;
while(1)
{
SOCKET temp;

FD_SET(udpsock,&rdsocks);//setup udp macros
FD_SET(tcpsock,&rdsocks);

if( select(max,&rdsocks,NULL,NULL,NULL) == SOCKET_ERROR )
{
perror("Select error");
WSACleanup();
return 1;
}
for(temp = 0; temp<=max;temp++) // loop on TCP sockets
{
if(FD_ISSET(temp,&rdsocks))
{
printf("Socket %d is ready \n",temp);
// process tcp messages
}

}
if(FD_ISSET(udpsock,&rdsocks)) // udp connection, parse control message
{
int ret = 0;
res = recvfrom(udpsock, buff,sizeof(buff),0,(struct sockaddr*)&udpclient,lenaddr);
//process udp message, setup tcp connection here if requested and add to file descriptor list?
}

}

最佳答案

创建监听 TCP 套接字(socket(2)bind(2)listen(2))后,使用 setsockopt(2) 将其标记为非阻塞,并将其添加到 select(2) 的读取集中.

当它变为“可读”时,表示您有客户端连接挂起,请调用 accept(2) .将新连接的套接字也添加到读取集中。

您可能希望保留这些客户端套接字的列表/哈希/任何内容,因为在每次调用 select(2) 之前必须重新初始化读取集。并计算它的第一个参数 (max fd)。

注意 0:我在这里引用了 Linux 手册页,但逻辑几乎是跨平台的。您可以在 MSDN 上找到 Windows 引用资料.注 1:Windows select()忽略它的第一个参数。

关于c - 了解用于接收 UDP 消息和打开 TCP 套接字的选择循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731418/

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