2016-08-24 10 views
1

問題があります.SocketConnection経由で大きな文字列を送信したいのですが、ネットワークが限られているため〜1500バイトまで、どのようにしてTCPClientを使わずにSocket上のすべてのバイトを受信することができますか、それは不可能です。ソケット接続経由で大きなデータストリームを受信する方法 - TCPClientを使用しないで

public string ReceiveString(Socket connection) 
    { 
     byte[] buffer = new byte[1048576]; 
     int recBytes = connection.Receive(buffer); 
     return UnicodeEncoding.Unicode.GetString(buffer, 0, recBytes); 
    } 

私がこれまで持っているもの厥、。

ソケットで取得することができない場合、「最後のオプション」としてTCPClientを使用するために、ソケットのEndPointを取得できますか?

+0

データをパケットに分割して受信(連結)するには、文字通り[プロトコルレベル](https://en.wikipedia.org/wiki/OSI_model#Layer_4:_Transport_Layer)を実装する必要があります。 – Sinatr

+0

できません。 TCPはすべてのメッセージを〜1500バイトのデータグラムに分割します。非同期メソッドを使用する必要がある場合は、同期Receive()メソッドを使用しています。送信関数に終端文字を追加する必要があります。そのため、受信関数は終了文字が見つかるまで1500個のデータグラムを読み続けることができます。 – jdweng

+0

TCPに何かの終了シーケンスがありますか?\ 0について何か聞いたことがありますか? – Silent3241

答えて

3

TCPはバイトストリームであり、メッセージの概念はありません。ワイヤ上の個々のパケットのサイズは無関係です。ネットワークハードウェアの実装の詳細です。 TCPはあなたが送信するものがあなたが受け取ったものであることを保証します(しかし、個々のセンドのサイズとUDPのような個々の読み込みのサイズとの間に1対1の関係はありません)。

解決策は、読者がいつ読書を停止するかを知ることができるように、送信者が文字列データをフレームすることを必要とします。

  1. 文字列データを送信する前に文字列長を送信してください。リーダーは長さを最初に読み取ってから、指定されたバイト数を読み取ることができます。

  2. a。文字列そのものに表示されない一意の区切り文字で文字列を終了します。リーダは、デリミタが検出されるまで読み取りを続けることができます。

    b。デリミタは接続を閉じることができます。リーダは、切断が検出されるまで読み取りを続けることができます。あなたが使用する必要があるソリューション

は、あなたが実装されている特定のプロトコルに依存します。 #1はバイナリプロトコルに最適で、効率的なメモリ管理が可能ですが、#2はテキストベースのプロトコル、または最終的な長さが事前にわからないストリーミングプロトコルに適しています。 #1と#2aが不可能な場合、プロトコルは#2b(HTTPとFTPの両方がそれを時間として利用する)に頼らざるを得ないことがあります。

+0

あなたのためにメッセージング/フレーミングを実装するTCPの上に構築されたより高いレベルのプロトコルに切り替えます。 –

+0

@Damien_The_Unbelieverあなたはおそらく、プロトコルよりもpremadeライブラリのほうがいいと思っています。メッセージングプロトコルを設計/採用するだけであれば、依然としてメッセージフレームの送信と読み取りのためのコードを実装する必要があります。 –

+0

まあ、私は、 "HTTPに切り替える"かそれに類するものを考えていました。私。すでにメッセージングの概念を持っているTCPの上に構築されたプロトコルです。 –

関連する問題