1

私は次のコードを持っています...

クライアントコード

#include<stdio.h>
#include<string.h>
//#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
main()
{   
        struct sockaddr_in client,server;
    int s,n;
        char b1[100],b2[100];
        s=socket(AF_INET,SOCK_DGRAM,0);
        server.sin_family=AF_INET;
        server.sin_port=2000;
        server.sin_addr.s_addr=inet_addr("127.0.0.1");
        printf("\nClient ready....\n");
        n=sizeof(server);
        while(1)
        {
            printf("\nClient:");
            gets(b2);
            sendto(s,b2,sizeof(b2),0,(struct sockaddr *)&server,n);
            if(strcmp(b2,"end")==0)
                break;
            recvfrom(s,b1,sizeof(b1),0,NULL,NULL);
            printf("\nServer:%s",b1);
        }

}

サーバーコード.....

#include<stdio.h>
#include<string.h>
//#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
main()
{
    struct sockaddr_in cliaddr,myaddr;
    int servsock,clisock;
    char b1[100],b2[100];
    servsock=socket(AF_INET,SOCK_DGRAM,0);
    myaddr.sin_family=AF_INET;
myaddr.sin_port=2000;
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
bind(servsock,(struct sockaddr *)&myaddr,sizeof(myaddr));
printf("\nServer ready,waiting for client....\n");
clisock=sizeof(cliaddr);
while(1)
{
    recvfrom(servsock,b1,sizeof(b1),0,(struct sockaddr *) &cliaddr,&clisock);
    if(!(strcmp(b1,"end")))
        break;
    printf("\nCliaddr:%s",b1);
    printf("\nmyaddr:");
    gets(b2);
    sendto(servsock,b2,sizeof(b2),0,(struct sockaddr *) &cliaddr,clisock);

}
}

これらのコードは、単一クライアントの UDP チャット用です....複数のクライアント UDP チャットにするには、どのような変更を加える必要がありますか....複数のクライアントがサーバーにメッセージを送信できるようにしたい..

4

2 に答える 2

0

並行サーバーを作成するには、 fork() を使用する必要があります。このリンクがお役に立てば幸いです。 http://www.cems.uwe.ac.uk/~ngunton/worksheets/npws3.pdf

于 2012-09-14T18:30:46.190 に答える
0

別の方法として、select などの API (多くのソケット記述子を監視し、データが利用可能なソケット記述子を返す) を使用して、同時サーバーを作成することもできます。

select を使用した同時サーバー

上記の例は tcp で記述されていますが、udp を使用するように調整できます。

他のオプションには、ポーリング、Linux 2.6 での epoll の使用、またはフォークとは別にスレッドの使用が含まれる場合があります。

fork は別の新しいプロセスを作成します。これは、多数のクライアントを処理する場合、つまり、Web サーバーが数万の要求を処理する場合など、実行できない場合があります。現在、クライアントごとにそれほど多くのスレッドまたはプロセスを作成できません。さらに、リクエストの受信時にこれを行うにはオーバーヘッドがあります。

実際的な解決策は、両方を組み合わせて使用​​することです。つまり、ワーカー プロセスまたはスレッドのプールによって監視されるソケット記述子の大規模なセットを作成します。これらは、ディスクリプタのいずれかが解放されるとすぐに作業用のディスクリプタを取得します。

C10k では、高性能サーバー アプリケーションを作成するための多くの可能な戦略について、それぞれの長所と短所について説明しています。

于 2012-09-15T11:55:34.547 に答える