パートナーがソケットサーバーとしてサービスを提供するプロジェクトに取り組んでいます。そして、私はそれと通信するためのクライアントソケットを書きます。通信は双方向です。サーバーにリクエストを送信してから、サーバーからの応答を受信します。
問題は、サーバーにデータを送信したのに、サーバーがデータを受信できないことです。
私の側からは、 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でラップして、フラッシュする必要がありますか?
または、サーバーソケットは「バッファリングされていない」ストリームを使用する必要がありますか?
提案やアドバイスをありがとう!