c# - 缓冲存储器分配

标签 c# sockets memory-management garbage-collection buffer

我在缓冲存储器分配方面遇到了问题。我有带有两个线程的WF聊天应用程序:一个发送,一个接收。第一个客户端向服务器发送消息:

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

确实很奇怪,因为如果服务器重新发送消息,它将毫无问题地接收到客户端。但是第一个消息始终为空。实际上,它收到了我测试的第一条消息
int rcv = clientSock.ReceiveFrom(buf, ref servEP);

它返回right int,但buf值为零。

最佳答案

什么是buf.Length?还有一行buf = new byte [1024];//分配用于接收的内存使我感到困惑

您能检查一下您第一次运行的尺码是多少吗?也许是零?我看不到您在哪里声明它,这就是为什么它困扰我。你为什么不写var buf2 = new byte [1024];并将所有buf更改为buf2。实际上,您不能简单地编写byte [] buf而不是buf =吗?为什么不起作用?它不能是编译错误吗?

-有评论,但我有感觉可以解决。如果不是这种情况,我将删除-

关于c# - 缓冲存储器分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14032042/

相关文章:

c# - 是否可以在 MS Entity Framework 中查询新添加的对象

c# - WPF MVVM 从 BackgroundWorker 更新 UI 绑定(bind)属性

c# - 如何创建语法高亮文本框

Java - 程序在 Eclipse 中完美运行,但在导出到可运行 jar 时似乎没有执行其预期任务

java - 服务中的套接字 + 通知

c# - 身份验证 gmail api C# windows phone 8.1

python - 在 Python 中将 long 从寄存器转换为 char 数组

windows - 内存密集型应用程序的内存管理

c++ - 如何为非常大的筛子保留内存?

c++ - 如何使用套接字将 Arduino 连接到 C++?