繁体   English   中英

C#开始在foreach循环问题内发送

[英]C# Begin Send within a foreach loop issue

我有一组“数据包”,它们是自定义分类的,被掩盖到byte [],然后发送给客户端。 当客户端加入时,它们会使用先前在用户加入之前发送的“Catch Up Packets”进行更新。 可以将其视为聊天室,您可以使用以前的对话进行更新。

我的问题是在客户端,我们没有收到所有信息; 有时一点都不..

下面是我看到的伪c#代码

代码看起来像这样。

lock(CatchUpQueue.SyncRoot)
{
     foreach(Packet packet in CatchUpQueue)
     {
           // If I put Console.WriteLine("I am Sending Packets"); It will work fine up to (2) client sockets else if fails again.
          clientSocket.BeginSend(data, 0, data.length, SocketFlags.None, new AsyncCallback(EndSend), data);
     }
}

这是某种限制问题还是发送多次的问题:即:如果队列中有4个数据包,则它调用开始发送4次。

我搜索了一个类似的主题,我找不到一个。 谢谢您的帮助。

编辑:我还想指出客户端连接后客户端之间的发送正常继续发送。 但由于某种原因,此for循环中的数据包并非全部发送。

我会怀疑您是用数据包淹没了TCP端口,并且可能溢出了其发送缓冲区,这时它可能会返回错误而不是发送数据。

异步I / O的思想不是允许您同时发送无限数量的数据包,而是允许您的前台线程在后台执行一个或多个I / O操作的线性序列时继续进行处理。

由于TCP流是串行流,请尝试尊重它并依次发送每个数据包。 也就是说,在BeginSend之后,使用Async回调来检测发送完成之前再次发送。 您可以通过添加“睡眠”来有效地做到这一点,但这不是一个很好的解决方案(发送数据包的速度可能比可能的慢,或者您可能没有足够长时间的睡眠,并且数据包将再次丢失)

或者,如果您不需要I / O在后台运行,请使用简单的foreach循环,而使用同步而不是异步发送。

好的,

显然,一个修复,到目前为止仍然让我感到困惑,是Thread.Sleep为我发送的每个数据包的ms数。

所以...

for(int i = 0; i < PacketQueue.Count; i++)
{
     Packet packet = PacketQueue[i];
     clientSocket.BeginSend(data, 0, data.length, SocketFlags.None, new AsyncCallback(EndSend), data);
     Thread.Sleep(PacketQueue.Count);
} 

我假设由于某种原因,循环停止了一些调用的发生......我将继续使用它并尝试找到真正的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM