Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 套接字异步发送和接收数据_.net_Multithreading_Sockets_Asynchronous_Tcp - Fatal编程技术网

.net 套接字异步发送和接收数据

.net 套接字异步发送和接收数据,.net,multithreading,sockets,asynchronous,tcp,.net,Multithreading,Sockets,Asynchronous,Tcp,我正在开发一个软件,它可以从许多套接字发送和接收数据。它是高度异步的,因此我担心以下情况:N个线程试图将数据发送到同一套接字。这就是,N个线程同时调用BeginSend 澄清:我没有使用线程,但“系统”会这样做。这就是文档所说的:“当应用程序调用BeginSend时,系统将使用单独的线程来执行指定的回调方法” 我做这个测试是为了知道SocketException是否失败(因为我找不到相关文档): 它是绿色的。但是,我需要知道它是否有问题。假设在调用EndSend/EndReceive之前可以多次

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

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

我做这个测试是为了知道SocketException是否失败(因为我找不到相关文档):

它是绿色的。但是,我需要知道它是否有问题。假设在调用EndSend/EndReceive之前可以多次调用BeginSend/BeginReceive,这样安全吗?我是说,下面的模式行吗

  • 贝金森
  • 贝金森
  • 贝金森
  • EndSend
  • EndSend
  • EndSend
  • 那么到货数据订单呢?我知道这是TCP,但我的问题是,如果BeginSend是异步的,那么从1发送的数据会在2和3之前到达吗


    谢谢。

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

    关键是我没有使用线程,但“系统”会这样做。这就是文档所说的:“当应用程序调用BeginSend时,系统将使用单独的线程来执行指定的回调方法”。我假设“系统”就是操作系统。我会更新我的问题,让它清楚。谢谢你,我道歉。我知道操作系统会按照你发送它的顺序来做,如果.NET类是一个包装器,那么你现在所做的就可以了。操作系统不会对每个发送请求使用不同的线程。解释您的说明时,我怀疑该类在操作系统级别使用IO完成。这意味着回调将从一个不同的线程到您在其上调用BeginSend的线程-但是,只涉及一个额外的线程。只要你的回调是线程安全的,一切都应该很好。哦,我明白了。这意味着我的三个BeginSend调用将操作系统中的三个“作业”排队,然后操作系统异步(按请求的顺序)执行其作业,并以正确的顺序调用我的回调(使用IO完成功能)。这是正确的吗?是的,这就是操作系统级别发生的情况。
        [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);
        }