socket udp无法接收数据的问题,求教

bevyn 2016-09-18 02:47:19
部分相关代码:

luboskt = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
luboskt.Bind(new IPEndPoint(IPAddress.Parse(ip), Convert.ToInt32(port)));
luboskt.ReceiveBufferSize = 30000 * 1400;

while (index > 0 && luboskt.Available > 0)
{
index--;
length = luboskt.Receive(M_Rec);//, ref tendPoint);
this.Invoke(Deal_Lubo, new Object[] { M_Rec, length });
}
问题描述:
对方发送数据正常,本机wireshark能正确抓取接收的数据包;
本机软件启动后,不主动发送数据的时候,接收不到数据,socket.Available一直为0,取消对Available的判断后,程序一直阻塞,仍接不到数据;
本机软件主动发送一帧报文后,可以正常接收对方发送的数据了;
也就是说,本机网口能正常接收数据,但socket无法获取网口接收过来的数据。connect对方ip和端口也没有效果。
...全文
1166 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq824279824 2017-08-02
  • 打赏
  • 举报
回复
补充一下,我用的是Ubuntu14.04的系统,每次开机重启后数据有时能进socket有时进不了
qq824279824 2017-08-02
  • 打赏
  • 举报
回复
我现在也遇到同样的问题,请问楼主最后是怎么解决的?
我是瓶起子 2016-11-22
  • 打赏
  • 举报
回复
引用 5 楼 bevyn的回复:
因为我在Receive()之前是有判断的(判断语句: while (index > 0 && luboskt.Available > 0)),所以是不会出现阻塞的情况的。 我现在的情况是,明明对方发来了很多数据了,但 luboskt.Available一直等于0,也就是一直判断没有数据,根本就没有执行到Receive()函数这一步。 看来真没有人遇到我这种情况吧。
Ipendpoint实例化在第一行,实例化udpclient时传入!
bevyn 2016-10-13
  • 打赏
  • 举报
回复
因为我在Receive()之前是有判断的(判断语句: while (index > 0 && luboskt.Available > 0)),所以是不会出现阻塞的情况的。 我现在的情况是,明明对方发来了很多数据了,但 luboskt.Available一直等于0,也就是一直判断没有数据,根本就没有执行到Receive()函数这一步。 看来真没有人遇到我这种情况吧。
我是瓶起子 2016-09-29
  • 打赏
  • 举报
回复
Receive最好开辟一个线程,来不断循环不断侦听每次发来的数据,你的Send传递的数据如果为二进制,最好分成两次传递,第一次传递二进制数据的长度,第二次传递数据,Receive接收的第一次数据得到二进制数据长度后,定义字节数组的长度,第二次向字节数组传递数据!
我是瓶起子 2016-09-29
  • 打赏
  • 举报
回复
length = luboskt.Receive(M_Rec);//, ref tendPoint); 会挂起等待数据的传入,此时线程阻塞。 接收端开起异步吧!
bevyn 2016-09-29
  • 打赏
  • 举报
回复
谢谢楼上的回复。 我以前一直认为用UdpClient和以udp的方式定义socket效果是一样的,所以一直用的socket。 从我测试看,如果我的电脑不向对方主动发报文,就不会主动查询对方的ARP信息,没有ARP信息,就无法收到对方的数据。 所以我一直怀疑,操作系统的协议栈实现方式的问题。 楼上提供的建议,我先试一试,多谢
xian_wwq 2016-09-18
  • 打赏
  • 举报
回复
不需要自己再造轮子 C# 中UDP数据包的发送、接收通过UdpClient就能完成, UdpClient位于命名空间System.Net.Sockets中。 如果不使用异步处理的话,代码很简单


server = new UdpClient ( ) ;   
receivePoint = new IPEndPoint (new IPAddress ( "127.0.0.1" ) , 8080 ) ;   
byte[] recData = server.Receive ( ref receivePoint ) ;  

111,083

社区成员

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

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

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