2012-05-11 6 views
-2

私はC#で書かれており、1はnetworkStream.beginWriteコマンドを使用して、次を送信し、両方の二つのプログラムがあると思うしますTCPは最初、私は

1,2,3,4,5 .... ..200,201,202 ...(一部の終端バイト配列)

さて、私は他のプログラムを持っているバイトを取得し、それが何らかの理由で読み込み、最初のものがある:

197、198、199 ....(終端アレイ)

私の質問は、なぜ私のTCP beginWriteが(バッファーを)送信しているのですか?

また、いくつかの背景情報については、私はbeginReceiveで反対側でそれを読んでいます。また、送信しているバイト配列は30000バイトで、他のコンピュータの1024バイトバッファに読み込んでいます。私がこれを行い、終端配列を使って分割すると問題になるでしょうか?ここで

は、コンピュータ1上で私のsendコマンドである:ここで

public bool sendToServer(SocketAsyncEventArgs e, params byte[][] buffer) 
     { 

      int length = 0; 
      foreach (byte[] bytes in buffer) 
      { 

       length += bytes.Length; 
      } 
      byte[] buffer2 = new byte[length + 5]; 
      int index = 0; 
      foreach (byte[] bytes in buffer) 
      { 
       Buffer.BlockCopy(bytes, 0, buffer2, index, bytes.Length); 
       index += bytes.Length; 
      } 


      byte[] eof = { 60, 69, 79, 70, 62 }; 
      Buffer.BlockCopy(eof, 0, buffer2, index, 5); 
      // netStream.Write(buffer2, 0, buffer2.Length); 
      netStream.BeginWrite(buffer2, 0, buffer2.Length, new AsyncCallback(SendCallback), clientSocket); 
      //socketEventArg.SetBuffer(buffer2, 0, buffer2.Length); 
      //Socket sock = socketEventArg.UserToken as Socket; 
      //bool willRaiseEvent = sock.SendAsync(socketEventArg); 
      Console.WriteLine("Sending: " + buffer2.Length + " bytes of data"); 
      //foreach (byte bi in buffer2) 
      { 
      //  Console.WriteLine(bi); 
      } 

     // clientSocket.BeginSend(buffer2, 0, buffer2.Length, 0, 
      //  new AsyncCallback(SendCallback), clientSocket); 


      return true; 
     } 

はそのデータを受信するための私のコードです:

public void AcceptCallback(IAsyncResult ar) 
     { 

      // Get the socket that handles the client request. 
      Socket listener = (Socket)ar.AsyncState; 
      Socket handler = listener.EndAccept(ar); 
      Console.WriteLine("Connected!"); 
      // Create the state object. 
      MonkeyObject state = new MonkeyObject(); 
      state.workSocket = handler; 
      MonkeyObjects.Add(state); 
      listener.BeginAccept(
         new AsyncCallback(AcceptCallback), 
         listener); 
      byte[] buffer = new byte[1024]; 
      state.currentBuffer = buffer; 
      handler.BeginReceive(buffer, 0, MonkeyObject.BufferSize, 0, 
       new AsyncCallback(ReadCallback), state); 
     } 
+2

コードを教えてください。 「終端アレイ」とは何ですか? – svick

+0

コードの最後に、5バイトを追加します:60,69,79,70,62 – rkrishnan2012

+0

クライアントとサーバーのプロジェクト全体をzipファイルに投稿したいですか?それは私の他の問題のいくつかを解決するでしょう。これは私が試しているかなり簡単なことです。 – rkrishnan2012

答えて

0

なぜなら、複数のsendコマンドに同じバッファを使用しており、送信する必要があるデータを上書きするからです。この場合、セミランダムデータを送信することができます(バッファの更新時と実際の送信開始時に応じて)。

+0

さて、私はバッファの問題を解決し、それが問題を解決するかどうかを確認しようとします。明日も戻ってきますか? – rkrishnan2012

+0

私の回答は、コード全体を投稿する前に投稿されていることに注意してください(何らかの理由でその半分がコメントアウトされています)。あなたのコードにはうまくいかないかもしれません。 –

+0

私は今、コンピュータ1にデータのサイズを送信させることでそれを修正しました(したがって、コンピュータ2はバッファに割り当てるべき量を知っています)。これが効率的かどうかはわかりません。これは私があなたの答えから解釈したものです。ありがとう! – rkrishnan2012

1

あなたが使用してネットワーク上のパケットの順序を確認することもできますWiresharkのようなスニッファは、あなたが思っていることをコードが実行していることを確認するだけです。

しかし、TCPは送信時に各パケットにシーケンス番号を割り当て、受信者はシーケンス番号を使用して適切な順序でメッセージを再構成します。パケットはが正しい順序でに到着する必要はなく、実際にはパケットが到着しないことがあります。

関連する問題