嗨,我正在为网络类工作一个项目,我们正在网络中创建节点,这些节点通过 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?
}
}