こんにちは、ネットワーク クラスのプロジェクトに取り組んでいます。このプロジェクトでは、udp 経由で制御アプリからメッセージを受信し、他のノードとの tcp 接続を作成するノードをネットワーク内に作成しています。基本的な順序は次のとおりです。 1) コントロール マネージャがノード A に udp メッセージを送信し、ノード B に接続するように指示する 2) ノード A が udp メッセージを受信し、その udp メッセージをノード B に転送する 3) ノード B が udp メッセージを受信し、ランダムにポートを選択する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?
}
}