0

私はソケットプログラミングが初めてで、何か質問したいだけです。

クライアントとサーバーの間で単純な受信者と送信者のパケットを作成しようとしていましたが(同じコンピューターを使用しています)、問題が発生しました...

送信機能は正常に動作していますが、まったく同じサイズのパケットで送信されたパケットを受信する方法がわかりません。

たとえば、クライアントからサーバーに 5 バイトを送信します。サーバーに 5 バイトだけを受信させたいだけで、それ以上でもそれ以下でもなく、Socket でこれを実行したいのですが、短いパケットのサイズもすでに含まれています。 (int16 2 バイト) 形式。ここで私の送信パケットコード:

    public static void Send(Socket socket, byte[] buffer, int timeout)
    {
        int startTickCount = Environment.TickCount;
        int sent = 0;
        int offset = 0;
        int size = buffer.Length;

        // Add size of packet in the begin of data packet with short (int16) format
        List<byte> tmpdata = new List<byte>();
        tmpdata.AddRange(BitConverter.GetBytes((short)(buffer.Length + 2)));
        tmpdata.AddRange(buffer);
        buffer = tmpdata.ToArray();

        do
        {
            if (Environment.TickCount > startTickCount + timeout)
                throw new Exception("Sending packet was timeout.");
            try
            {
                sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None);
            }
            catch (SocketException ex)
            {
                if (ex.SocketErrorCode == SocketError.WouldBlock ||
                    ex.SocketErrorCode == SocketError.IOPending ||
                    ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
                {
                    Thread.Sleep(30);
                }
                else
                    throw ex;
            }
        } while (sent < size);
    }

誰かが私を助けることができますか?


修正してくれたダミアンに感謝します。解決策が見つかりましたが、各バイトをループするため、メモリ使用量が消費されるのではないかと心配しています。コードは次のとおりです。

    public static byte[] Receive(Socket socket)
    {
        System.Net.Sockets.NetworkStream ns = new NetworkStream(socket);
        int b = (byte)1;
        List<byte> databuf = new List<byte>();

        while ((b = ns.ReadByte()) != -1)
            databuf.Add((byte)b);

        return databuf.ToArray();
    }

NetworkStream を使用しない、またはパフォーマンスを向上させるより良いソリューションはありますか? ありがとう

4

2 に答える 2

3

受信コードは表示されていませんが、1 つのバグを簡単に修正できます。

    // Add size of packet in the begin of data packet with short (int16) format
    List<byte> tmpdata = new List<byte>();
    tmpdata.AddRange(BitConverter.GetBytes((short)(buffer.Length + 2)));
    tmpdata.AddRange(buffer);
    buffer = tmpdata.ToArray();
    int size = buffer.Length; //Moved from higher up, now that buffer is a different size

受信側でも、同様のコードが必要です。2 バイトを読み取るまでループし、それを使用して、short受信する合計サイズである a を作成し、2 を引きます (正直なところ、上記のコードに 2 を追加することは避けて、サイズをエンコードするために使用される実際のバイト数を無視したサイズとしてサイズを送信します)、メッセージ全体を読むまで再度ループします。

于 2013-05-20T14:56:15.443 に答える