抓包收到,在udp中未收到

幽行 2017-06-16 10:16:44
如题:
代码如下:
服务端:
class UdpService2
{
IPEndPoint m_ServerIP;
List<IPEndPoint> client_list;
bool m_bStart;
Thread m_tService;
Socket m_Service;
ShowImg m_ShowDlg;
List<UdpPacket> m_packs;
byte[] data = new byte[1024 * 1024];

public void SetPort(int port)
{
// 172.21.8.115
IPAddress ip = IPAddress.Parse("172.21.8.115");
this.m_ServerIP = new IPEndPoint(ip, port);
}

public void Start()
{
if (m_bStart)
return;
m_bStart = true;
client_list = new List<IPEndPoint>();
m_tService = new Thread(new ThreadStart(ServiceThread));
m_tService.Start();
m_ShowDlg = new ShowImg();
m_packs = new List<UdpPacket>();

//Thread t = new Thread(new ParameterizedThreadStart(B));
//t.Start("B");
}
public void Stop()
{
if (m_bStart)
{
m_bStart = false;
m_Service.Shutdown(SocketShutdown.Both);
m_Service.Close(); 
m_tService.Join();
}
}

private void ServiceThread()
{
// Console.WriteLine("UDP服务器开始监听" + serverIP.Port + "端口");
m_Service = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
m_Service.Bind(m_ServerIP);
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)ipep;
// length = m_Service.ReceiveFrom(data, ref Remote);//接受来自服务器的数据
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));

}

private void ServiceRecive(IAsyncResult result)
{
AsyncState state = (AsyncState)result.AsyncState;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)ipep;
try
{
m_Service.EndReceiveFrom(result, ref state.EndPoint);
client_list.Add(state.EndPoint as IPEndPoint);
result.AsyncWaitHandle.Close();
}catch(Exception ex){
int i = 1;
}
try
{
UdpPacket pack = UdpPacket.Deserialize(data);
if (IsRecive(pack))
{
//清空数据,重新开始异步接收
data = new byte[data.Length];
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));
return;
}
m_packs.Add(pack);
if (m_packs.Count == pack.total)
{
MessageBox.Show("接收完成");
}
}
catch (Exception ex)
{
//MessageBox.Show(string.Format("Error: {0}, Length={1}", ex.Message, length));
}

//清空数据,重新开始异步接收
if (m_Service != null)
{
data = new byte[data.Length];
try
{
m_Service.BeginReceiveFrom(data, 0, data.Length, SocketFlags.None, ref Remote, new AsyncCallback(ServiceRecive), new AsyncState(data, 0, data.Length, Remote));
}
catch (System.Exception ex)
{

}
}
}
}

通过判断client_list 中有几个元素,来确定收到了几个包。

实际一共13个包,在程序中只收到2个包
...全文
607 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_24399089 2017-06-20
  • 打赏
  • 举报
回复
楼主威武,解决了我困扰已久的问题
xuggzu 2017-06-16
  • 打赏
  • 举报
回复
不是你发的太快,主要是你用的是UDP。
幽行 2017-06-16
  • 打赏
  • 举报
回复
客户端代码: public void SendMsg(string strMsg) { IPAddress ip = IPAddress.Parse("172.21.8.115"); IPEndPoint iep = new IPEndPoint(ip, 9187); //MemoryStream ms = new MemoryStream(strMsg); byte[] bytes = System.Text.Encoding.Default.GetBytes(strMsg); ICollection<UdpPacket> packs = UdpPacketSplitter.Split(1000001, bytes, 30); foreach (UdpPacket pack in packs) { // byte[] datagram = pack.ToArray(); byte[] datagram = UdpPacket.SerializeObject(pack); UdpPacket pack2 = UdpPacket.Deserialize(datagram); picUDP.BeginSend(datagram, datagram.Length, iep, SendCompleted, ""); } //向子网发送信息 //picUDP.Send(bytes, bytes.Length, iep); } public void SendMsg(byte[] strMsg) { IPAddress ip = IPAddress.Parse("172.21.8.115"); IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9187); ICollection<UdpPacket> packs = UdpPacketSplitter.Split(1000001, strMsg, 8179); foreach (UdpPacket pack in packs) { // byte[] datagram = pack.ToArray(); byte[] datagram = UdpPacket.SerializeObject(pack); UdpPacket pack2 = UdpPacket.Deserialize(datagram); picUDP.BeginSend(datagram, datagram.Length, iep, SendCompleted, ""); System.Threading.Thread.Sleep(100); } } public void SendCompleted(Object obj) { //MessageBox.Show("1"); }
幽行 2017-06-16
  • 打赏
  • 举报
回复
发送的包频率太快:虽然每个包的大小都小于mtu size 但是频率太快,例如40多个mut size的包连续发送中间不sleep,也有可能导致丢包。这种情况也有时可以通过设置socket接收缓冲解决,但有时解决不了。所以在发送频率过快的时候还是考虑sleep一下吧。 另外,我处理收到的包时,应该用了较长的时间在处理包的内容,导致后续的包无法收到。
幽行 2017-06-16
  • 打赏
  • 举报
回复
找到原因了,
幽行 2017-06-16
  • 打赏
  • 举报
回复
引用 5 楼 xian_wwq 的回复:
数据接收和数据解析分离可以提高效率,减少udp丢包
已经分离了,测试中,收到包后计数,然后不做任何处理丢了,还是一样。
xian_wwq 2017-06-16
  • 打赏
  • 举报
回复
数据接收和数据解析分离可以提高效率,减少udp丢包

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧