0

私は c でプロキシを実装しており、I/O でブロックしないように select() を使用しています。プロキシに接続しているクライアントが複数あるため、サーバーからの応答メッセージをどのソケットに転送するかがわかるように、メッセージにソケット記述子 # を含めます。

ただし、read() がヌル文字までの完全なメッセージを受信せず、select() の次のラウンドで残りのメッセージを送信することがあります。応答を転送するソケットがわかるように、メッセージ全体を一度に受信したいと思います (複数のクライアントがある場合、どのメッセージがどのソケットに属しているかがわからないため、バッファリングは機能しません)。null 文字が到着するのを待っている間に読み取りをブロックせずにこれを行う方法はありますか?

4

2 に答える 2

7

TCP にはメッセージのようなものはありません。これはバイト ストリーム プロトコルです。バイトを書き込み、バイトを送信し、バイトを読み取ります。一度に受信できるバイト数は保証されておらず、1 回の書き込みで書き込まれたデータ量と 1 回の読み取りで読み取られたデータ量の間に関連性が保証されているわけではありません。メッセージが必要な場合は、自分で実装する必要があります。任意の読み取りでは、バッファーの長さまで、0、1、またはそれ以上のバイトを読み取ることができます。半分のメッセージかもしれません。1.5通のメッセージかもしれません。それが何であるかは完全にあなた次第です。

于 2012-09-16T04:10:09.680 に答える
0

個別のメッセージを実行する場合は、ZeroMQを使用してください。膨大な数の言語にバインドされており、ネットワーキングのための優れた抽象化です。実際、このプロキシモデルを処理できます。

于 2012-09-17T06:29:58.080 に答える