1

バッファ メモリの割り当てに問題があります。私は 2 つのスレッドを持つ WF チャット アプリケーションを持っています。1 つは送信用、もう 1 つは受信用です。最初のクライアントがサーバーにメッセージを送信します。

    private async void send_button_Click(object sender, EventArgs e)
    {
        string msg = this.messageTextBox.Text.Trim();
        await Task.Run(() =>
        {
            buf = Encoding.ASCII.GetBytes(msg); //buf-buffer for send/rcv
            clientSock.SendTo(buf, servEP);
            this.Invoke((Action)delegate
            {
                this.dialogTextBox.Text += string.Format("client: {0}", 
                      this.messageTextBox.Text.Trim());
            });
         buf = new byte[1024]; //allocate memory for receiving
        });
    }

次にサーバーが応答し、ここでバッファに問題が発生します。

    private async void Form1_Load(object sender, EventArgs e)
    {
        clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 
                             ProtocolType.Udp);
        servIPEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 50000);
        servEP = (EndPoint)servIPEP;

        clientIPEP = new IPEndPoint(IPAddress.Any, 43000);
        clientEP = (EndPoint)clientIPEP;
        clientSock.Bind(clientEP);
        while (true)
        {
            await Task.Run(() =>
            {
                //buf = new byte[1024] I tried to allocate here, but it's not working.

                int rcv = clientSock.ReceiveFrom(buf, 0, buf.Length, 
                    SocketFlags.None, ref servEP); // it returns right int value!
                msg = Encoding.ASCII.GetString(buf, 0, rcv); //but buf is empty..
                this.Invoke((Action)delegate
                {
                    this.dialogTextBox.Text += rcv;
                    this.dialogTextBox.Text += string.Format("server: {0},rcv: {1}", 
                        msg, rcv) + Environment.NewLine; //msg is empty...
                });
            });
        }
    }

サーバーがメッセージを再送信すると、クライアントで問題なく受信されるため、これは非常に奇妙です。ただし、最初のメッセージは常に null です。実際、最初のメッセージを受け取り、テストしました

int rcv = clientSock.ReceiveFrom(buf, ref servEP);

正しいintを返しますが、buf値はゼロです。

4

1 に答える 1

1

buf.Length とは何ですか? また、行 buf = new byte[1024]; //受信用にメモリを割り当てると混乱する

初めて走るときのサイズを確認していただけますか?もしかしてゼロ?あなたがそれをどこで宣言したのかわかりません。それが私を悩ませている理由です。var buf2 = new byte[1024]; と書いてみませんか?すべての buf を buf2 に変更します。実際、buf = の代わりに単純に byte[] buf と書くことはできませんか? なぜ機能しないのですか?コンパイルエラーになりませんか?

-コメントでしたが、これで解決する気がします。違ったら消します(-_-;)

于 2012-12-25T16:19:48.770 に答える