winform UDP广播 问题,???

allen_00 2015-04-15 04:53:57
背景: 用UDP发送和接受数据,发送和接受端口均为 62006,结果用Wireshark抓包在发送时出现源端口变为57223或其他,目的口还是62006,这样导致接受不到数据。下面贴代码
   Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//创建套接字,协议类型设为UDP

单击事件 UDP发送:
 
IPEndPoint iepp_send = new IPEndPoint(IPAddress.Broadcast, 62006);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1);
socket.SendTo(picInforSendFmt[PicSendUsedPr].SendData, iepp_send);


线程接收:

private void ReceiveThread()//线程
{
threadReceive = new Thread(ReceiveMessage);
threadReceive.IsBackground = true;
threadReceive.Start();
}
private void ReceiveMessage() //UDP接受
{
//绑定主机(地址设为IPAddress.Any)
int port = 62006;
IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);
EndPoint ep = iep as EndPoint;
socket.Bind(ep);
while (true)
{
byte[] bArray = new byte[1024];
socket.ReceiveFrom(bArray, ref ep);
.....................
bArray =null;
}



后来 我把接收端口改为0 IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 结果还是收不到数据,说明:发送和接收数据都能抓到包!
...全文
206 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
allen_00 2015-04-16
  • 打赏
  • 举报
回复
OK 问题解决了 ,说到底还是不同窗体之间的传值问题,子窗体在调用父窗体的函数时 也要用委托或者属性,之前 子窗体在调用 UDP socket时 由于之前的端口已经被父窗体绑定,子窗体才会随机一个端口发送。 我还是面向过程的思维 惭愧
allen_00 2015-04-16
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
如果你发送之前没有端口绑定,就会被(任意)分配一个可用端口。 因此,如果要用具体端口发送,那么可以在创建Socket后绑定到具体端口。 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(new IPEndPoint(IPAddress.Any, port));
看我的接受线程部分,在 主form加载的时候socket.Bind(ep);就已经绑定了!会不会是因为,我在子窗体调用父窗体的UDP发送函数导致端口错误
Forty2 2015-04-16
  • 打赏
  • 举报
回复
如果你发送之前没有端口绑定,就会被(任意)分配一个可用端口。 因此,如果要用具体端口发送,那么可以在创建Socket后绑定到具体端口。 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(new IPEndPoint(IPAddress.Any, port));
allen_00 2015-04-15
  • 打赏
  • 举报
回复
发送和接收是在同一个客户端里面 ,数据发送到服务器,然后接受服务器的返回信息。
程序架构: WinForm .net 4.0 功能点: 一、日常提示 上下线提示,更新获取局域网QXin用户列表,正在输入提示、类QQ界面模式 二、字符串通信 单用户字符串通信、多用户字符串广播 三、文件通信 单用户单文件传送,单文件夹传送、多文件多文件夹混合传送。 多用户广播传送 程序实现过程: UDP通信:(上下线提示,字符串通信) 一发一回的方式,例如:用户A上线,以广播的方式发送“我上线啦”的消息,其他用户接收后把该用户加添到用户列表里,返回一个“已收到”信息,用户A接收到各个用户返回的信息并一一加载到用户列表。 TCP通信:(文件传送) 首先用户A以UDP方式通知用户B,”我要发送某某文件”,用户B接收后,AB用户开始进行TCP连接,然后发送文件 单文件发送和文件夹发送差别很大,由于文件夹不是文件,只能通过发送消息通知远程用户在什么地方建立一个文件夹,然后送该文件夹下的文件。如果该文件夹有子文件夹,又系同样的方式通知远程用户在哪个文件里新建子文件夹,不断递归。 (PS:飞鸽协议是开源的,不过飞秋可不是,飞秋虽然同样采用飞鸽协议,但是在此基础上增加修改了不少内容,要兼容飞秋需要用WPE抓包分析飞秋的数据包。) 分层架构模式思想: 所谓分层架构,分层架构并不是一个程序分几个模块或者源文件就是分层架构,分层架构是一种模式,分层架构必须只能自上往下操作,下层不知上层的内容,上层只能调用其下层的函数,UI层调用BLL层,BLL层调用DAL层. 而BLL层是绝不可以调用UI层的. 例如BLL层绝不能出现MessageBox等winform方法。而且,要做到BLL和DAl 在脱离UI表面层后,转到控制台通过调用其类和方法也能正常运行,才算好的分层架构。

110,534

社区成员

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

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

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