それぞれが 5 つの異なるポートで送信する 15 の異なるクライアントからデータを受信する必要があります。全部で 15 *5 ソケット。
各クライアント ポート番号が定義され、固定されています。例クライアント1、ポート3001から3005。クライアント2、ポート3051から3055など。最初のポート(3001、3051)がコマンドの送信に使用されるという共通点があります。他のポートはデータを送信します。
データを受信したら、チェックサムを確認する必要があります。recvd パケットを追跡し、失われた場合はパケットを再要求し、ハードディスク上のファイルに書き込む必要もあります。
制限上記の設計を変更することはできません。また、UDP から TCP に変更することもできません。読んだ後に私が知っている2つの方法は
- select() を使用した非同期多重化。
- ソケットあたりのスレッド。
私は最初のものを試しましたが、データを取得した時点で立ち往生しています。データを受信できました。私はいくつかの処理を行う必要があるので、ソケットごとに (または) ソケットを処理するためにスレッドを開始したい (たとえば、すべての最初のポート、すべての 2 番目のポートなど..ie3001、3051 など) しかし、ここでクライアントがデータを送信すると、FD_ISSET は次のようになります。 true 、スレッドを開始すると、すべてのメッセージのスレッドになります。 質問: ここにスレッド コードを追加する方法です。たとえば、if(FD_ISSET ..) 内に pthread_create を含めると、受信したメッセージごとにスレッドを作成します。しかし、ソケットごとにスレッドが必要でした。
while(1)
{
int nready=0;
read_set = active_set;
if((nready = select(fdmax+1,&read_set,NULL,NULL,NULL)) == -1)
{
printf("Select Errpr\n");
perror("select");
exit(EXIT_FAILURE);
}
printf("number of ready desc=%d\n",nready);
for(index=1;index <= 15*5;index++)
{
if(FD_ISSET(sock_fd[index],&read_fd_set))
{
rc = recvfrom(sock_fd[index],clientmsgInfo,MSG_SIZE,0,
(struct sockaddr *)&client_sockaddr_in,
&sockaddr_in_length);
if(rc < 0)
printf("socket %d down\n",sock_fd[index]);
printf("Recieved packet from %s: %d\nData: %s\n\n", inet_ntoa(client_sockaddr_in.sin_addr), ntohs(client_sockaddr_in.sin_port), recv_client_message);
}
} //for
} //while