3

我正在开发一种软​​件,该软件可以从/向许多套接字发送和接收数据。它是高度异步的,因此我担心以下情况:N 个线程试图将数据发送到同一个套接字。也就是说,N 个线程同时调用 BeginSend。

澄清:我没有使用线程,但“系统”做到了。这就是文档所说的:“当您的应用程序调用 BeginSend 时,系统将使用单独的线程来执行指定的回调方法

我已经完成了这个测试,以了解它是否因 SocketException 而失败(因为我找不到关于它的文档):

    [Test]
    public void DoIt2()
    {
        var byteCount = 0;
        var manualEvents = new[] { new ManualResetEvent(false), new ManualResetEvent(false), new ManualResetEvent(false) };
        var message = new byte[] { 0x01, 0x02, 0x03, 0x04 };
        var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        var callback = new AsyncCallback(ar =>{
            var resetEvent = (ManualResetEvent)ar.AsyncState;
            Interlocked.Add(ref byteCount,  socket.EndSend(ar));
            resetEvent.Set();
        });

        socket.Connect("127.0.0.1", 8000);
        socket.BeginSend(message, 0, message.Length, SocketFlags.None, callback, manualEvents[0]);
        socket.BeginSend(message, 0, message.Length, SocketFlags.None, callback, manualEvents[1]);
        socket.BeginSend(message, 0, message.Length, SocketFlags.None, callback, manualEvents[2]);

        WaitHandle.WaitAll(manualEvents);

        socket.Close();
        Assert.AreEqual(12, byteCount);
    }

它通过了绿色。但是,我需要知道它是否有问题。假设在调用 EndSend/EndReceive 之前可以多次调用 BeginSend/BeginReceive 是否安全?我的意思是,以下模式好吗?

  1. 开始发送
  2. 开始发送
  3. 开始发送
  4. 结束发送
  5. 结束发送
  6. 结束发送

到达数据顺序呢?我知道这是 TCP,但我的问题是,鉴于 BeginSend 是异步的,从 1 发送的数据会在 2 和 3 之前到达吗?

谢谢你。

4

1 回答 1

0

我不知道 .NET 套接字对象的细节,但一般来说,从不同的线程发送到同一个套接字并不是一个好主意。在套接字上发送的数据可以是任何顺序,并且很可能违反该套接字上的协议。

于 2013-07-19T19:07:47.410 回答