【问题标题】:C# Async socket problemC#异步套接字问题
【发布时间】:2010-11-14 12:47:14
【问题描述】:

我的代码有一个奇怪的问题,目前一切正常,除了发送部分。每当我尝试发送一个数据包时,它实际上会发送许多空数据包,我无法找出原因,我已经检查了调试器并且 SendPacket 函数只被调用了一次。谢谢大家!

【问题讨论】:

  • “空包”是什么意思?您如何在服务器端阅读? TCP 是一种流协议,它不会在数据包中“思考”。接收方可能需要多次调用 Receive 才能从单个发送中获取所有数据,类似地,由于 Nagle,多个发送最终可能会在单个接收中结束。您正在发送一个空数组(即全零)。如果您的服务器解释得很奇怪,或者使用一个小缓冲区调用 Receive,它看起来就像“多个数据包”。
  • 哇。在所有这些小时之后..问题出在以下行 Client.BeginSend(buff, 0, buff.length, SocketFlags.None, new AsyncCallback(SendData), Client);它正在向服务器端应用程序发送 8192 字节.. 呃,我真是个白痴,无论如何谢谢你!
  • 我可以看到您可能错过了它,但我之前的评论是 second 次,我告诉您您发送的数组全是零。 “无论如何。”
  • 嗯,它不是空的。我只是寄错了尺码,所以寄的太多了。很抱歉造成误会,非常感谢您的帮助。英语不是我的母语,“无论如何感谢您的帮助”并不是什么不好的意思。

标签: c# tcp asynchronous send packet


【解决方案1】:

我所看到的:您通过 OnPacketRecvSendPacket 中将数组 (loginOutBuffer) 传递给 Socket.BeginSend(),但在 OnPacketRecv 之后立即将其清除。

Socket.BeginSend() 在传入时不会复制数组,因此它会将数据发送到现在已清除的数组中,从而导致另一端出现零。

【讨论】:

  • 确实如此,但这与主要问题本身无关。问题是我在我的服务器应用程序中收到了许多空数据包,即使我只调用了一次 beginend。仍然感谢您的帮助!
  • 查看我对您问题的评论以获取我的回复。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2011-06-01
  • 1970-01-01
相关资源
最近更新 更多