2

私は Beej のガイドを読んでいて、その例の 1 つであるストリーム クライアント/サーバーの例について詳しく説明したいと思いました。この例では、サーバーがメッセージを送信し、クライアントが受信します。

メッセージを送受信するプログラムを作成したいと思います。この場合、以前のサーバーとクライアントの両方が同じ役割を実行するため、サーバー/クライアント アーキテクチャではなくなります。それらは非常に似ています。

この例では、サーバーは次のことを行います。

 getaddrinfo(NULL, PORT, &hints, &p);
 sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol));
 bind(sockfd, p->ai_addr, p->ai_addrlen);
 listen(sockfd, BACKLOG);
 new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
 send(new_fd, "Hello, world!", 13, 0);

同じソケットからもメッセージを受信するには、何を追加する必要がありますか? 出来ますか?

元の socketfd を使用して connect() を試みたり、宛先情報を使用したりするなど、うまくいかないことをたくさん試しました。最後に、2 つのソケットを使用し、setsockopt() を使用してそれらを同じポートにバインドしましたが、より効率的な方法があるかどうかを知りたいです。

4

2 に答える 2

0

彼らは「タンゴには2つ必要だ」と言います。

クライアント/サーバー通信 (プロトコル) についても同様です。

問題は、クライアントがデータの送信を完了し、応答を生成しないことをサーバーが理解していないという事実に起因する可能性があります。

通信の終了を知らせるにはいくつかのオプションがあります。ここではいくつかの例を示します。

  • クライアントからのソケット出力をシャットダウンします。これにより、サーバーは EOF を感知します。
  • 送信するバイト数をサーバーに伝えます。サーバーはその数を読み取り、そのバイト数を読み取った後、返信を送信します。
  • End-Of-Request を通知するマジック バイト シーケンスをコーディングします。
于 2013-07-16T22:35:14.203 に答える