2

私は、TcpClient がネットワーク アプリケーションでのソケット操作を簡素化するという印象を受けてきました。

ただし、TcpClient は、基礎となるソケットからどれだけのデータを読み取る必要があるかを知る必要があるようです。TcpClient.GetStream(..).Read(..) が指定されたバイト数を読み取る Socket.Receive(..) を呼び出すようです。

TcpClient は NetworkStream を公開しますが、これは処理が非常に面倒です。終了文字列や信頼性の低い DataAvailable プロパティのようなものは、不明な TCP "パケット" の読み取りを複雑にします。

Socket.ReceiveFrom(..) の使用は、より「パケット」指向のようです。

私は通常、TcpClientを使用してバインドやハンドシェイクなどを行い、読み取りには使用します

        Socket socket = _tcpClient.Client;

        byte[] buffer = new byte[1000];

        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
        EndPoint senderRemote = sender;

        int length = socket.ReceiveFrom(buffer, ref senderRemote);

        string replyString = Encoding.ASCII.GetString(buffer, 0, length);

        return replyString;

バッファーの初期化に多少のオーバーヘッドがありますが、Networkstream から一度に 1 バイトを読み取り、終了文字または文字列を探すよりも優れています。

TcpClient がより適切な方法でデータの読み取りを処理しない、つまり Socket のように処理しないのは少し奇妙ではありませんか?

4

1 に答える 1

1

ペイロードのサイズを含む固定サイズのヘッダーを持つプロトコルがあるため、それほど奇妙ではないかもしれません。

あなたの場合Socket、 s を直接使用する方が良いかもしれません。またはNetworkStream、バッファに読み込みPeek()、終了文字のためにそこに入ることができるようにするラッパーを書くことができます。

于 2012-06-25T12:52:44.833 に答える