2012-05-07 13 views
1

私のソケットクライアントがサーバに返信していたデータと同じデータを受信して​​いないことに気がつきました。テキストは8192文字後に切り捨てられます。ソケットで実際に長いメッセージが受信される

私は気づいていない制限がありますか?どのように私はこれを過去にするのですか?

クライアントは、このコードを使用しています。

//Send and Receive 
public string sendAndReceiveMSG(string msg) 
{ 
    try 
    { 
     NetworkStream serverStream = clientSocket.GetStream(); 
     string sendresponse = sendMSG(msg, serverStream); 
     if (sendresponse == "ConnectionCrash") 
     { 
      return sendresponse; 
     } 
     else if (sendresponse == "OK") 
     { 
      string receiveresponse = receiveMSG(serverStream); 
      return receiveresponse; 
     } 
     return "UnknownErrorInternal"; 
    } 
    catch (Exception ex) 
    { 
     return "UnknownErrorInternal"; 
    } 
} 

//Send msg 
private string sendMSG(string msg, NetworkStream serverStream) 
{ 
    try 
    { 
     byte[] outStream = System.Text.Encoding.ASCII.GetBytes(msg); 
     serverStream.Write(outStream, 0, outStream.Length); 
     serverStream.Flush(); 
     return "OK"; 
    } 
    catch (Exception ex) 
    { 
     endSock(); 
     return "ConnectionCrash"; 
    } 
} 

//Receive msg 
private string receiveMSG(NetworkStream serverStream) 
{ 
    try 
    { 
     byte[] inStream = new byte[10025]; 

     int buffSize = clientSocket.ReceiveBufferSize; 
     dynamic bytesRead = serverStream.Read(inStream, 0, buffSize); 

     string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, bytesRead); 
     return returndata; 
    } 
    catch (Exception ex) 
    { 
     endSock(); 
     return "ConnectionCrash"; 
    } 
} 

クライアントはそのようにように、サーバーからの応答を取得。

string recv = client.sendAndReceiveMSG("someRequest"); 
+0

読み込むデータがまだある間は、ループスルーして読み込みを続ける必要があります。 – zimdanen

+0

ストリームと呼ばれる理由があります。バイトは一方の端に入り、もう一方の端から出てきます。ヨーダは「メッセージはありません」と言います。 – HABO

+0

なぜbytesReadは動的ですか? –

答えて

5

あなたはReadへの1回のコールしか処理していません。この動作は完全に予想されます。すべてのデータを単一のパケットにまとめることはほとんどありません(率直に言っても、私はあなたがそれを早く気付かなかったことに驚いています)。および処理する前に、データのフレーム価値を得る - あなたは「フレーミング」政策( - 多分新しい行のテキストベース、またはバイナリのための長さプレフィックス場合、すなわち、各サブメッセージを区別する方法)を決定する必要があり

。これは通常、ループ内でReadを呼び出すことを意味します。つまり、StreamReader(ループ内でReadLine()を呼び出します)のようなものを使用して(テキストの場合)呼び出します。

ソケットにメッセージが1つしかなく、発信者が接続を閉じた場合は、フレーミングを省略し、Readが何かを返さない限り(つまりEOF)読み込みます。

+0

ありがとう、私はフレーミングポリシーを探検し、[このcodeprojectの記事](http://www.codeproject.com/Articles/37496/TCP-IP-Protocol-Design-Message-Framing)にも出くわしました。これも私が気づいていなかった理由今までこれ。 – natli

関連する問題