Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C#异步套接字BeginSend EndReceive_C#_Sockets - Fatal编程技术网

C#异步套接字BeginSend EndReceive

C#异步套接字BeginSend EndReceive,c#,sockets,C#,Sockets,我是编程新手,对异步套接字编程感到困惑 例如,假设我有两个BeginSends,一个接一个。第一个发送一百万个字符,第二个只发送64个字符 由于异步的性质,第二个BeginSend不会在第一个之前完成吗 如果是这样,我如何判断在EndRecieve接收的数据属于哪条消息?包含一个参数AsyncCallback。如果您使用两个不同的回调,您可以看到哪一个首先完成 但是,如果您试图在同一个连接上发送两条消息,则会出现问题。在发送第二条消息之前,您应该等待第一条消息完全发送。您真的不应该一个接一个地呼

我是编程新手,对异步套接字编程感到困惑

例如,假设我有两个
BeginSend
s,一个接一个。第一个发送一百万个字符,第二个只发送64个字符

由于异步的性质,第二个
BeginSend
不会在第一个之前完成吗

如果是这样,我如何判断在
EndRecieve
接收的数据属于哪条消息?

包含一个参数
AsyncCallback
。如果您使用两个不同的回调,您可以看到哪一个首先完成


但是,如果您试图在同一个连接上发送两条消息,则会出现问题。在发送第二条消息之前,您应该等待第一条消息完全发送。

您真的不应该一个接一个地呼叫两个BeginSend。 我认为如果发生这种情况,您最终会看到抛出异常

在调用另一个BeginSend之前,必须先调用EndSend。这通常在回调函数中完成

查看MSDN上的示例。在回调中调用EndSend,然后设置名为“sendDone”的ManualResetEvent。这是线程间通信的一种形式,其中回调向主线程发出异步发送完成的信号。这样,您的程序就可以提示下一条数据

  • 从主线程调用BeginSend以发送前1000000字节
  • 您的主线程可以检查信号量或类似ManualResetEvent的东西,以触发它发送下一个64字节。另一个选项是使用队列发送数据
  • 数据发送完成后,将调用传入BeginSend的回调
  • 在此回拨中,您将调用EndSend。按照此操作,然后设置ManualResetEvent,或您希望使用的任何线程间触发器
我记得曾经做过一次的最简单的选择是,在回调中调用BeginSend以获取下一段数据,然后调用第一段数据

e、 g

调用BeginSend时,传入一个100字节的数据块(选择一个更大的数字以提高传输效率,但不要太大)进行发送,并将numbytes send递增100。 接下来,在完成上一次发送的回调中,您可以检查numbytestsent是否 这就是你如何发送一个文件——你一次发送一堆字节,然后一直发送文件块,直到全部发送完毕

我强烈建议使用一个简单的客户机/服务器来执行类似于通过连接发送完整文件的操作。还可以查看MSDN文档和web上的许多其他示例


掌握好这一点将有助于您处理许多其他C#主题,因为异步工作(或使用委托/回调)在.NET中非常常见

我认为发送可能会起作用,但我怀疑消息将变得交错且不可解析。这就是问题所在。我如何避免这种情况?这是可以做到的,因为像mirc这样的应用程序一直在处理此类问题。我想知道如何实现它?等待第一条消息完全发送?我应该在EndSend中有代码来检查第一条消息是否完成?是的。您不需要“EndSend中的代码来检查第一条消息是否完成”。当您收到回拨时,表示发送已完成。谢谢Fuzz,您提到了一个要点。我不确定这种行为。我只是想在编写代码之前澄清一些疑问。谢谢马克,这一直是我构建网络代码的方式。我已经做过很多次了,但总是从一个通用的简单起点开始,然后再开始。有人能解释一下它们的意思吗:它假设一个名为connectDone的全局ManualResetEvent。@Eidenai MSDN站点上的示例没有提供示例所需的所有成员或全局变量。在本例中,他们假设您在某个地方有一个名为connectDone的ManualResetEvent类型的可访问变量,以便他们可以使用它与connectDone.WaitOne()和connectDone.Set()进行线程间通信。此变量需要位于两个线程都可以访问的位置
int NumBytesSent; // member variable containing how many bytes you have sent so far
string Message;   // Message to send that is large