【问题标题】:same buffer for several async sends多个异步发送的相同缓冲区
【发布时间】:2011-06-08 01:58:29
【问题描述】:

对并行运行的多个 socket::send 使用相同的缓冲区是否正确?我没有看到我的 c# 测试应用程序有任何问题。但是我没有看到任何示例或文档。所以我正在寻找这方面的权威参考。

using System;
using System.Net;
using System.Net.Sockets;

namespace ReuseSocketBuffer
{
    class Program
    {
        static byte[] reciveBuffer = new byte[1024];
        static byte[] senderBuffer = new byte[1024];

        static void Main(string[] args)
        {
            var sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            listener.Bind(new IPEndPoint(IPAddress.Any, 0));
            listener.Listen(1);
            var ar1 = listener.BeginAccept(null, null);

            sender.Connect(new IPEndPoint(IPAddress.Loopback, (listener.LocalEndPoint as IPEndPoint).Port));

            var receiver = listener.EndAccept(ar1);

            receiver.BeginReceive(reciveBuffer, 0, reciveBuffer.Length, SocketFlags.None, ReceiveCallback, receiver);

            var ee = new SocketAsyncEventArgs[1024];

            senderBuffer[0] = 1;
            senderBuffer[1023] = 2;

            for (; ; )
            {
                for (int i = 0; i < ee.Length; i++)
                {
                    ee[i] = new SocketAsyncEventArgs();
                    ee[i].SetBuffer(senderBuffer, 0, senderBuffer.Length);
                }

                for (int i = 0; i < ee.Length; i++)
                    sender.SendAsync(ee[i]);
            }
        }

        static int count = 0;

        static void ReceiveCallback(IAsyncResult ar)
        {
            var receiver = ar.AsyncState as Socket;

            int received = receiver.EndReceive(ar);
            while (received < 1024)
                received += receiver.Receive(reciveBuffer, received, reciveBuffer.Length - received, SocketFlags.None);

            Console.Write("\r{0}", count++);

            if (reciveBuffer[0] != 1 || reciveBuffer[1023] != 2)
                throw new Exception();

            receiver.BeginReceive(reciveBuffer, 0, reciveBuffer.Length, SocketFlags.None, ReceiveCallback, receiver);
        }
    }
}

【问题讨论】:

    标签: .net sockets buffer send


    【解决方案1】:

    只要不修改缓冲区中的数据就可以了。

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2012-07-23
      • 1970-01-01
      • 2015-05-17
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多