0

データを受信し、処理のために読み取るソケット接続があります。
データがソケットから十分に速く処理/プルされない場合、TCP レベルでボトルネックが発生し、受信データが遅延します (解析後の tmestamps でわかります)。

ソケットによる読み取りを待機している TCP バイト数を確認するにはどうすればよいですか? (WireShark などの外部ツールを介して)

 private void InitiateRecv(IoContext rxContext)
    {
        rxContext._ipcSocket.BeginReceive(rxContext._ipcBuffer.Buffer, rxContext._ipcBuffer.WrIndex,
            rxContext._ipcBuffer.Remaining(), 0, CompleteRecv, rxContext);
    }

    private void CompleteRecv(IAsyncResult ar)
    {
        IoContext rxContext = ar.AsyncState as IoContext;
        if (rxContext != null)
        {
               int rxBytes = rxContext._ipcSocket.EndReceive(ar);

                if (rxBytes > 0)
                {
                    EventHandler<VfxIpcEventArgs> dispatch = EventDispatch;
                        dispatch (this, new VfxIpcEventArgs(rxContext._ipcBuffer));

                    InitiateRecv(rxContext);

                }
          }
     }

事実は、「ディスパッチ」が何らかの形でそれが完了するまで受信をブロックしていると推測していることです (つまり、処理されたデータがディスパッチによって遅延されるため、データが蓄積されたという私の (間違った?) 結論)ソケットレベルまたはそれ以前。

4

3 に答える 3

1

Wireshark のような外部ツールに関しては、ソケットに残っているバイト数を知ることができません。それらは、ネットワーク インターフェイスを通過したパケットのみを認識します。Wireshark で確認する唯一の方法は、ソケットから読み取った最後のバイトを実際に把握し、Wireshark でそれらを見つけて、そこからカウントすることです。

ただし、この情報を取得する最善の方法は、.NET アプリケーションのソケット オブジェクトの Available プロパティを確認することです。

于 2012-07-02T12:03:51.990 に答える
1

ソケットによる読み取りを待機している TCP バイト数を確認するにはどうすればよいですか

送信しようとしているバイト数を示すプロトコルを指定する。ソケットを使用すると、バイト レベルより上のいくつかのレイヤーを操作できます。バッファリングと遅延のために、最終的に呼び出しsend()として終了する呼び出しの数を確認することはできません。receive()

あらかじめバイト数を指定して のような文字列を送っておけば、メッセージが と のように"13|Hello, World!"2 つに分かれて届いても問題ありません。"13|Hello"", World!"

receive()さまざまな呼び出しの間に、ある種の状態とバッファーを保持する必要があります。

于 2012-07-02T11:50:07.850 に答える
1

socket.Available 通常Socketクラスをご利用の方はご利用いただけます。それ以外の場合は、相手側から送信されるバイト数を指定するヘッダー バイトを定義する必要があります。

于 2012-07-02T11:52:53.977 に答える