2011-01-12 63 views
0

对于多个套接字::发送并行运行使用相同的缓冲区是否正确?我没有看到这个我的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); 
     } 
    } 
} 

回答

1

只要不修改缓冲区中的数据,这应该没问题。