Socket.ReceiveMessageFrom()のエンドポイントパラメーターとは何ですか?

.net c# sockets
Socket.ReceiveMessageFrom()のエンドポイントパラメーターとは何ですか?

診断作業を行うために、iSCSIのプロキシアプリケーションを作成しています(iSCSIのFiddlerを考えてください)-一度に1パケットずつデータをキャプチャしようとしています。パケットと半分-私は本当にWiresharkが表示するのと同じ種類のデータを見たいです。 これを行う際に、 `Socket.ReceiveMessageFrom()`を使用しています。

ただし、パラメーターの1つは「エンドポイント」と呼ばれ、それをどうするかはよくわかりません。 何か手がかりはありますか? ここに私のコードがあります、私が完全にベースから外れているかどうか教えてください:

Tuple readOnePacket(TcpClient conn) {
    var flags = SocketFlags.None;
    EndPoint endpoint = null;   /*** You can't set this to null!! ***/
    byte[] buffer = new byte[10 * 0x100000];
    int offset = 0;
    int bytes_received;

    do {
        IPPacketInformation packet_information;
        bytes_received = conn.Client.ReceiveMessageFrom(buffer, offset, BufferSize,
                                                        ref flags, ref endpoint, out packet_information);

        if (flags == SocketFlags.Partial) {
            // We only want to transfer full packets
            offset = bytes_received;
            continue;
        }
    } while (false);

    return new Tuple(buffer, bytes_received + offset );
}

  3  0


ベストアンサー

TcpClient.ReceiveMessageFrom()ではなく、Socket.ReceiveMessageFrom()です。

http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receivemessagefrom.aspx [ドキュメント]をご覧になると、次の内容を読むことができます。

_
参照によって渡される、リモートサーバーを表すhttp://msdn.microsoft.com/en-us/library/system.net.endpoint.aspx[EndPoint]。
_

編集:nullに設定することは、実際には悪い考えです。

1


あなたの質問への直接的な答えではありませんが、この答えはまだ役に立つと思います(質問が尋ねられてからかなりの時間が経過しました)。

iSCSIがTCPで動作するのか、プレーンIPで動作するのかわからないため、問題の解決策を提供できません。 しかし、一般に、TCPはストリーム指向のプロトコルであり、「メッセージ」という概念はありません。 一方、IPはデータグラムです(つまり、 メッセージ)指向のプロトコル、およびメッセージの概念があります。 コードでは、TCPソケットから「メッセージ」(IP構成体)を読み取ろうとしていますが、これは機能しません。 はい、TCPはIPに基づいていますが、IPデータグラムはTCPレベルでは表示されません。

あなたが言及した問題(完全なメッセージを読んで、次のメッセージを読まない)はTCPレベルにのみ適用できます。IPでは実際に1つのメッセージ全体を読むことができるからです。 TCPレベルで同じことが必要な場合は、メッセージをサポートするプロトコルを使用する必要があります。 通常、これを実現するには、次のようなメッセージを使用して、TCPに基づいたプロトコルを所有する必要があります。

[msg header] [msg body]

[msg header]は次のようなもので構成されます。

[msg type] [msg body length]

メッセージタイプとメッセージ本文の長さは固定長(たとえば、メッセージタイプは2バイト、本文長は4バイト)であり、メッセージ本文は可変長であるため、ヘッダー全体を読み取って、本文の長さを決定し、その上で全身をお読みください。

お役に立てれば。

1


タイトルとURLをコピーしました