0

私は現在、インターネットを介してCでクライアント/サーバーアプリケーションを実行しています。サーバーは、クライアントからの新しい接続をリッスンし続けます。現在、クライアントをリッスンしていますが、クライアントが接続すると、サーバーはそれ以上のクライアントをリッスンし続けません。以下は、クライアントに接続するためのサーバー側のコードを示しています。

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in sockaddr, cliaddr;
bzero(&sockaddr, sizeof(struct sockaddr_in));
bzero(&cliaddr, sizeof(struct sockaddr_in));

    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = INADDR_ANY;
    sockaddr.sin_port = ntohs(atoi(argv[1]));

if(bind(sockfd, (struct sockaddr *) &sockaddr, sizeof(sockaddr)) <0) {
    printf("error binding socket: %d\n", errno);
    exit(1);
}

printf("binded to %d : %d\n", sockaddr.sin_addr.s_addr, htons(sockaddr.sin_port));

listen(sockfd,5);
socklen_t clilen = sizeof(cliaddr);
int newsockfd = accept(sockfd, (struct sockaddr *) &cliaddr, &clilen);
    if (newsockfd < 0) 
        error("ERROR on accept");

printf("server connected to %d:%d\n", cliaddr.sin_addr.s_addr, htons(cliaddr.sin_port));

接続が確立されると分岐する何らかの形式のスレッドを作成する必要があると想定しています。しかし、私はそれを実装する方法を知りません。

どんな助けでも大歓迎です

4

2 に答える 2

3

次の点が役立つ場合があります。

  1. 1 つの接続を受け入れた後、再度戻ってさらに多くの接続を受け入れることができるように、accept 呼び出しをループにする必要があります。
  2. 各接続を個別に処理するには、pthread_create または同様のスレッド作成 APIを使用してスレッドを作成できます。
  3. 同じスレッドで複数の接続を簡単に処理できるノンブロッキング ソケットの使用を選択できます。
于 2012-05-15T04:59:22.963 に答える
1

次の本を集めて、C で並行サーバーを開発する方法を学び、理解することができます。回答では、並行サーバーのさまざまな書き方を例を挙げて説明するのは難しいです。書籍のサンプルのソース コードはダウンロードできるので、書籍がなくても試すことができます (同じ URL にあります)。コードを調べると、物事がどのように機能するかがわかります。

UNIX ネットワーク プログラミング、第 1 巻、第 2 版: ネットワーク API: ソケットと XTI

この本は、ソケットプログラミングについて知りたいことのほとんどすべてをカバーしています。

于 2012-05-15T05:54:01.360 に答える