gpt4 book ai didi

.net - Socket 异步发送和接收数据

转载 作者:可可西里 更新时间:2023-11-01 02:34:45 26 4
gpt4 key购买 nike

我正在开发一种软​​件,可以从/向大量套接字发送和接收数据。它是高度异步的,因此我担心以下情况: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 之前到达吗?

谢谢。

最佳答案

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

关于.net - Socket 异步发送和接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17753569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com