UDP服务器有时候收不到数据的问题?

scoredhigh 2014-04-09 09:26:46
我写了一个UDP的服务器和客户端,客户端每秒发送1k左右的数据。
现象是这样的,开启服务器,打开客户端发送数据,这时候服务器是收得到数据的。如果这是关闭服务器,让客户端继续发送数据大概5秒钟,然后关闭客户端。
再开启服务器,打开客户端发送数据,这时候服务器就会收不到数据。把服务器和客户端关闭一段时间后再开启,有时候服务器收得到数据,有时候收不到数据,这个情况是几乎是随机的,有时候在服务器代码里随便加一个空行编译一下就可以收到数据了。
如果服务器在收得到数据的情况下一直不关闭程序,这时候无论客户端关闭还是停止发送数据,只要再发送数据,服务器都可以收得到数据。

我想问的是,为什么当关闭服务器,而客户端继续发送数据几秒钟后,就一定会出现开启UDP服务器收不到数据的情况?这是什么引起的?要怎么解决?
...全文
1234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_lichao0331 2015-10-15
  • 打赏
  • 举报
回复
一秒1K为啥不用TCP,好耿直
six-years 2014-04-09
  • 打赏
  • 举报
回复
你这个测试我以前也做过没有出现你说的问题 贴代码来看下
scoredhigh 2014-04-09
  • 打赏
  • 举报
回复
UDP服务器无论是阻塞还是非阻塞都会出现这样的问题
scoredhigh 2014-04-09
  • 打赏
  • 举报
回复
UDP无论是阻塞还是飞阻塞都会出现这样的问题
scoredhigh 2014-04-09
  • 打赏
  • 举报
回复
我知道原因了,不是因为udp服务器的问题,而是因为upd客户端数据发送程序的问题,当关闭了upd客户端后,没有关闭socket导致的。 多谢两位朋友回帖。
tcmakebest 2014-04-09
  • 打赏
  • 举报
回复
只要服务器开着就能收到数据,可能是错误处理代码编写不过关,导致内部出错了。
scoredhigh 2014-04-09
  • 打赏
  • 举报
回复
这个用的是阻塞模式,用非阻塞也有一样的问题。 如果服务器一直开着,客户端发送数据或是停止发送数据,服务器运行都是正常的。一旦服务器关闭以后,再运行,就会发生收不到客户端数据的问题。
scoredhigh 2014-04-09
  • 打赏
  • 举报
回复
服务器代码: 点击按钮启动线程接收程序 private void btnSetup_Click(object sender, EventArgs e) { int m_port; try { m_port = 2012; IPEndPoint m_EndPoint = new IPEndPoint(IPAddress.Any, m_port); m_udpClinet = new UdpClient(m_EndPoint); threadRecv = new Thread(new ThreadStart(fun));//生成线程类对象 threadRecv.Start(); btnSetup.Enabled = false; } catch (Exception e) { Debug.WriteLine(e.StackTrace); } } 接收线程 public void fun()//在线程中执行的方法,必须为公有void类型方法,不能有参数。 { int datalen = 0; ushort cmd = 0; int machine_number = 0; byte ack = 0; uint seq_pack_num = 0; string m_FromIP; while(true)//死循环,线程将一直运行 { try { data = m_udpClient.Receive(ref m_FromPoint); if (data.Length > 2) { DataParse.parse_pack(data, data.Length, ref datalen, ref cmd, ref machine_number, ref ack, ref seq_pack_num); switch (cmd) { case PKG_REGISTER: case PKG_ECG1: case PKG_ECG2: case PKG_RESP: case PKG_SPO2: case PKG_NIBP: case PKG_TEMP: case PKG_CO2: case PKG_PATIENT: //DataParse.PackModuleDataAck(data); //UDPServ.m_server.Send(data, 18, m_FromPoint); break; } if (cmd == 0x20) { Debug.WriteLine("ParseUdpPkg ------ ECG1 netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x21) { Debug.WriteLine("ParseUdpPkg ------ ECG2 netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x22) { Debug.WriteLine("ParseUdpPkg ------ RESP netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x0C) { Debug.WriteLine("ParseUdpPkg ------ SPO2 netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x0D) { Debug.WriteLine("ParseUdpPkg ------ NIBP netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x0E) { Debug.WriteLine("ParseUdpPkg ------ TEMP netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x2D) { Debug.WriteLine("ParseUdpPkg ------ CO2 netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } if (cmd == 0x0F) { Debug.WriteLine("ParseUdpPkg ------ patient netPkg, time: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")); } } } catch (Exception e) { Debug.WriteLine(e.StackTrace); } Thread.Sleep(1);//休眠1豪秒钟 } }

110,565

社区成员

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

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

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