【问题标题】:buffer memory allocation缓冲内存分配
【发布时间】:2012-12-25 15:47:31
【问题描述】:

我遇到了缓冲内存分配问题。我有两个线程的 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);

它返回正确的 int,但 buf 值为零。

【问题讨论】:

  • 什么是buf.Length? buf = new byte[1024]; //allocate memory for receiving 这行也让我感到困惑
  • buf.Length-是byte[] buf的长度(要接收的字节数),可以去掉,我这样做只是为了测试。 "buf = new byte[1024]; //为接收分配内存" 由于 ReceiveFrom() 是阻塞函数,所以当我发送消息时,buf 会改变 "buf = Encoding.ASCII.GetBytes(msg); //buf-buffer for send /rcv"-现在buf的大小就是msg的大小。这就是我创建新 buf 的原因,以防接收到的消息更大。
  • OHhhh 我想我有问题。当我运行我的应用程序 ReceiveFrom() 被阻塞时,等待传入消息。然后我在“void send_button_Click()”中发送消息,在那里更改 buf 大小,然后为新 buf 分配内存。是真的,当最终从服务器“ReceiveFrom(buf, ref servEP)”接收到消息时,这里的buf指向垃圾收集的内存?

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


【解决方案1】:

什么是buf.Length?还有一行 buf = new byte[1024]; //为接收分配内存让我很困惑

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

-是一个评论,但我觉得这可能会解决这个问题。不然我就删了-

【讨论】:

  • 私有字节[] buf = 新字节[1024];我宣布它是我班级的成员。
  • 我认为首先 ReceiveFrom() buf,指向垃圾回收。由于“buf = new byte[1024]; //分配内存用于接收”在另一个范围内。
猜你喜欢
  • 2019-07-11
  • 1970-01-01
  • 2017-04-17
  • 2014-11-11
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多