2011-01-05 20 views
3

C#でTCPIPソケットの受信バッファサイズを判断する方法はありますか。私はサーバーにメッセージを送信していて、受信バッファーサイズがわからないところで応答を期待しています。ソケット受信バッファサイズ

  IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.125.125.226"),20060); 
      Socket server = new Socket(AddressFamily.InterNetwork, 
           SocketType.Stream, ProtocolType.Tcp); 
      server.Connect(ipep); 

      String OutStr= "49|50|48|48|224|48|129|1|0|0|128|0|0|0|0|0|4|0|0|32|49|50"; 

      byte[] temp = OutStr.Split('|').Select(s => byte.Parse(s)).ToArray(); 

      int byteCount = server.Send(temp); 

      byte[] bytes = new byte[255]; 
      int res=0; 
      res = server.Receive(bytes); 
      return Encoding.UTF8.GetString(bytes); 

答えて

6

データを受信するために使用されるバッファのサイズは、アプリケーションまたはプロトコルに依存します。あなたの受信バッファのサイズを教えてくれる方法はありません。また、「このメッセージを受け取るために23867バイト必要です」という使用できるソケット関数もありません。一般的には、アプリケーションは受信バッファーのサイズとプロトコルをどのように処理する必要があります。通常、プロトコルは次のいずれかを行います。

  • メッセージのバイト数を指定します。
  • この結果は、アプリケーションがスプリットメッセージに対処する必要があるかもしれないということです

(メッセージの終わりを示すために、0x7eの使用例のHDLC用)終端文字を指定します。たとえば、サーバーが2000バイトのメッセージを送信する可能性がありますが、受信バッファーが1000バイトしかない場合は、メッセージを完了したか、または部分的に完了したかを示す状態を維持するコードを記述する必要があります。

+0

終了文字がないため、受信バイトが終了するまでループするなどの方法はありません。 – Kanishka

+0

@ Kanishkaは通常、最高のパフォーマンスを得るために複数のシステムページサイズを使用します。 http://msdn.microsoft.com/en-us/library/ms724958(v=vs.85).aspx –

+1

@Kanishka:うん、ここを見てくださいhttp://msdn.microsoft.com/en-us/library /8s4y8aff.aspx。 'Remarks'セクションで処理するのを待っているデータがあるかどうかを判断するために、Socket.Receiveの使い方の概要を説明します。 – sashang

4

TCPはバイトストリームです。あなたのメッセージの概念は何も知らない。

このように、そのバイトストリーム内に必要なメッセージフレーミング情報を指定する必要があります。これを行う一般的な方法には、メッセージの先頭にメッセージの全長を含むヘッダーを付けるか、有効なメッセージに表示されない文字でメッセージを終了させる方法があります。

TCPメッセージのフレーミングについては、ここではhttp://www.serverframework.com/asynchronousevents/2010/10/message-framing-a-length-prefixed-packet-echo-server.htmlと書いてありますが、これはC++コードを参照しているため、あなたには役に立たないかもしれません。

メッセージコンシューマがプレフィックス長のメッセージを扱うのは、通常はややパフォーマンスが向上します。メッセージプロデューサが文字区切りメッセージを生成するためには、しばしばより効果的です。個人的には、可能な限り、プレフィックス長のメッセージが好きです。

メッセージの長さであるxバイトのデータを最初に送信すると、ピアは長さを計算するために常に少なくともxバイトを読み取る必要があることを知ります。結果のメッセージのサイズを知り、それがその多くのバイトを持つまで読むことができます。

文字区切りのメッセージでは、メッセージの区切り文字が見つかるまで、読み込んだすべてのデータを読み取り、スキャンします。その後、全体のメッセージと、おそらくはより多くのデータ(次のメッセージの一部)がバッファに格納され、その後に処理されます。

関連する問題