嗨我正在爲網絡類創建一個項目,我們在網絡中創建節點,通過udp從控制應用程序接收消息,然後與其他人創建tcp連接節點。基本的順序是:1)控制管理器向節點A發送udp消息,告訴它連接到節點B 2)節點A接收到udp消息並將該udp消息轉發到節點B 3)節點B接收到udp消息,隨機選擇一個端口號碼,在該端口上打開一個偵聽的TCP套接字,併發送一個UDP端口號爲4的udp消息。節點A收到udp消息,並在該TCP端口上打開一個連接到節點B.理解選擇循環以接收UDP消息並打開TCP套接字
基本上,我想循環接收到的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?
}
}