0

パートナーがソケットサーバーとしてサービスを提供するプロジェクトに取り組んでいます。そして、私はそれと通信するためのクライアントソケットを書きます。通信は双方向です。サーバーにリクエストを送信してから、サーバーからの応答を受信します。

問題は、サーバーにデータを送信したのに、サーバーがデータを受信できないことです。

私の側からは、 http://www.linuxhowtos.org/C_C++/socket.htmの例のように非常に単純な実装を使用しています。

#include <sys/socket.h>

socket_connect();

construct_request_data();

send(socket, request_data, request_length, 0/*flag*/); // I set flag as 0

// now the server should receive my request and send response to me    

recv(socket, response_data, response_length, 0);   

socket_close();

そして、サーバーソケットはstd :: iostreamへの「バインディング」で実装されており、バッファリングされたストリームであるようです。(つまり、ソケットの送信/受信はiostream :: write / readで行われます。)

server_socket_io >> receive_data;

server_socket_io << response_data; 

ところで、私はパートナーからテストクライアントを入手しましたが、それもiostreamにラップされています。テストソケットクライアントは問題なくサーバーと通信できますが、ソケットが送信されるたびにiostream :: flush()を実行する必要があります。

ただし、ソケットクライアントをiostreamでラップしないように単純にしたいと思います。

バッファリングされたiostreamが問題を引き起こすかどうか疑問に思います。クライアントソケットが送信したデータはごく少量であり、まだバッファリングされているため、データは処理されません。

それとも私の問題でしょうか?本当にデータを送信したかどうかをどうやって知ることができますか?クライアントソケットもデータをバッファリングしますか?

TCP_NODELAYでいくつかの「悪い」回避策を試しましたが、役に立ちませんでした。

どうすれば問題を解決できますか?クライアント側から?またはサーバー側?データが「フラッシュ」されて処理されるように、要求を送信した後、応答を受信する前にソケットを閉じる必要がありますか?

または、ソケットをiostreamでラップして、フラッシュする必要がありますか?

または、サーバーソケットは「バッファリングされていない」ストリームを使用する必要がありますか?

提案やアドバイスをありがとう!

4

4 に答える 4

3

Jayの答えに加えて、任意のネットワークパケットスニファを試して、パケットがサーバーに到達しているかどうかを確認できます。wiresharkまたはtcpdumpを見てください。

于 2010-10-29T20:18:00.260 に答える
2

問題を解決するために「分割統治」を使用しましょう。

まず、サーバーは機能しますか?

コードから、サーバーがリッスンしているポート番号を検索します。

サーバープログラムを起動します。次のコマンドラインプログラムを実行して、サーバーが実際にリッスンしているかどうかを確認します。

netstat -an -p tcp

接続のリストが生成されます。サーバーの実行中は、選択したポートに接続が表示されます。サーバーを停止し、コマンドを再度実行して、ポートが使用されていないことを確認します。

サーバーがリッスンしていることを確認したら、次のコマンドを使用してサーバーに接続してみてください。

telnet your-server-address-here your-port-number-here

telnetは、サーバーから送信された内容を画面に出力し、入力した内容をサーバーに送り返します。

これはあなたにいくつかの良い手がかりを与えるはずです。

于 2010-11-01T17:01:58.417 に答える
1

私は以前に同じような問題を抱えていました。私の問題は、サーバーとクライアントの間にストリームを作成するために、サーバーで接続(TCP)を「受け入れ」なかったことです。サーバー側で接続を受け入れた後、すべてが設計どおりに機能しました。

于 2010-11-04T12:05:04.333 に答える
0

両方のシステムのファイアウォール設定を確認する必要があります。彼らはあなたのデータを渡していない可能性があります。

于 2010-10-29T20:11:05.123 に答える