-2

私は両方ともc#で書かれた2つのプログラムを持っており、1つはnetworkStream.beginWriteコマンドを使用して以下を送信します:

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

ここで、他のプログラムにバイトを取得させ、何らかの理由で最初に読み取るのは次のとおりです。

197, 198, 199....(終端配列)

私の質問は、TCP beginWrite がそれ (バッファ) を順不同で送信するのはなぜですか?

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

コンピューター1での送信コマンドは次のとおりです。

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);
        }
4

2 に答える 2

0

1 つの理由 (コードを表示しないため) は、複数の送信コマンドに同じバッファーを使用しており、送信する必要があるデータを上書きすることです。この場合、セミランダム データを送信できます (バッファを更新するタイミングと実際の送信が開始されるタイミングによって異なります)。

于 2012-05-11T02:07:53.527 に答える