我正在开发一个软件,该软件可以向许多套接字发送数据和接收数据。它是高度异步的,因此我担心以下情况: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,这样安全吗?我的意思是,下面的模式可以吗?
- 开始发送
- 开始发送
- 开始发送
- 结束发送
- 结束发送
- 结束发送
到货数据订单如何?我知道这是TCP,但我的问题是,如果BeginSend是异步的,从1发送的数据会在2和3之前到达吗?
谢谢。
我不知道.NET套接字对象的细节,但一般来说,从不同的线程发送到同一个套接字不是一个好主意。套接字上发送的数据可以是任何顺序的,并且很可能违反该套接字上的协议。