Udp 发送成功 但是接收端 没有收到数据包 是为什么? 求关注 求分析 求解答

zgml2007 2013-04-09 08:39:57
想要实现的是一个UDP推送功能, 实现 把本机接收到的UDP数据 直接转发到另一个Point,相当于一个传送功能。

遇到的问题:在本机测试, 使用netport抓包工具 可以看到本机把收到的数据进行了向外发送,但是接收端(另一台机子)却没有抓到相应的包(没有一次抓到,应该不是UDP丢包的问题)
测试环境:这里说的接收端既作为发送的数据源(使用UDP模拟发送器)也作为转发后的接收端 本机收到后 再转发给原来接收端; 这两台机子上的都有接收大量的UDP数据包(其他程序使用)

求关注 求分析 求解答

实现代码如下:
ublic partial class frmUdp : Form
{
//private UdpClient sendUdpClient;
//private UdpClient receiveUpdClient;
Socket sdsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Socket recsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

public frmUdp()
{
InitializeComponent();
//初始化页面信息

int recePort = 4102;

int sdPort = 5001;
receivePort.Text = recePort.ToString();//接收端口
sendPort.Text = sdPort.ToString ();//发送端口

tbxPath.Text = Application.StartupPath;
}
private void button1_Click(object sender, EventArgs e)
{
// 创建接收套接字
try
{
IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress receiveIp = ips[0];//与信息中心连接的Ip
//IPEndPoint receIpEndPoint = new IPEndPoint(receiveIp, int.Parse(receivePort.Text));
//receiveUpdClient = new UdpClient(receIpEndPoint);

IPEndPoint rip = new IPEndPoint(receiveIp, int.Parse(receivePort.Text));
//Socket recsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
recsock.Bind(rip);
//IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress sendIp = ips[0];//与运控连接的Ip
//IPEndPoint sendIpEndPoint = new IPEndPoint(sendIp, int.Parse(sendPort.Text));
/ndUdpClient = new UdpClient(sendIpEndPoint);
IPEndPoint sip = new IPEndPoint(sendIp, int.Parse(sendPort.Text));
//Socket sdsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
[b]
sdsock.Bind(sip);
[/b] //IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());


Thread receiveThread = new Thread(ReceiveMessage);
//Thread createFileThread=new Thread(CreateFile);

receiveThread.Start();
//createFileThread.Start();
}
catch(Exception ex)
{
Console.Out.Write(ex);
}
}

// 接收消息方法
private void ReceiveMessage()
{

IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote= (EndPoint)remoteIpEndPoint;
//IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.17"), 137);
while (true)
{
try
{
// 关闭receiveUdpClient时此时会产生异常
//byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint);
byte[] recdata = new byte[1024];
int rec = recsock.ReceiveFrom(recdata, ref remote);
byte[] receiveBytes = new byte[rec];
Buffer.BlockCopy(recdata, 0, receiveBytes, 0, rec);
//启动发送线程
Thread threadSend = new Thread(new ParameterizedThreadStart(SendMessage));
threadSend.Start(receiveBytes);
//string message = Encoding.Unicode.GetString(receiveBytes);
//List pointlist=destinationList.Rows;

//启动文件解析落地线程
//Thread saveThread = new Thread(SaveMessage);
/veThread.Start(receiveBytes);

// 显示消息内容
//ShowMessageforView(lstbxMessageView, string.Format("{0}[{1}]", remoteIpEndPoint, message));
}
catch(Exception e)
{
throw (e);
/;
}
}
}


//发送数据方法
private void SendMessage(object obj)
{

//IFormatter formatter = new BinaryFormatter();
//MemoryStream ms = new MemoryStream();
//formatter.Serialize(ms,obj);
//byte[] message = ms.GetBuffer();
try
{
var message = (byte[])obj;
for (int i = 0; i < destinationList.RowCount; i++)
{
if (destinationList.Rows[i] != null)
{
IPAddress remoteIp = IPAddress.Parse(destinationList[0, i].Value.ToString());
int remotePort = int.Parse(destinationList[1, i].Value.ToString());
IPEndPoint remotePoint = new IPEndPoint(remoteIp, remotePort);
//sdsock.SendTo(message, message.Length, SocketFlags.None, remotePoint);
sdsock.SendTo(message, remotePoint);

}
}
}
catch(Exception e)
{ Console.Out.Write(e); }
...全文
1757 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdq0916 2013-04-26
  • 打赏
  • 举报
回复
防火墙、网络带宽、360都可能造成UDP丢包
jsgnadsj 2013-04-22
  • 打赏
  • 举报
回复
应该是防火墙的问题吧
sumos 2013-04-10
  • 打赏
  • 举报
回复
udp通信比较简单,相信你的代码不会有太大问题。 可能是外部原因,比如防火墙
zgml2007 2013-04-10
  • 打赏
  • 举报
回复
引用 3 楼 zhoujielunzhimi 的回复:
udp通信比较简单,相信你的代码不会有太大问题。 可能是外部原因,比如防火墙
http://bbs.csdn.net/topics/390420223?page=1#post-394162875 麻烦在这回复下 好给分
zgml2007 2013-04-10
  • 打赏
  • 举报
回复
引用 2 楼 Mackz 的回复:
代码乱得没法看,还是C#的。不过建议你在SendTo之前检查一下发送的地址是否有效。
http://bbs.csdn.net/topics/390420223?page=1#post-394162875 麻烦在这回复下 好给分
zgml2007 2013-04-10
  • 打赏
  • 举报
回复
引用 1 楼 Geoff08Zhang 的回复:
UDP是不可靠的,确保不丢包,可以使用TCP,这有socket源码,你可以对照参考: http://download.csdn.net/detail/geoff08zhang/4571358
http://bbs.csdn.net/topics/390420223?page=1#post-394162875 麻烦在这回复下 好给分
菜牛 2013-04-09
  • 打赏
  • 举报
回复
代码乱得没法看,还是C#的。不过建议你在SendTo之前检查一下发送的地址是否有效。
Geoff08Zhang 2013-04-09
  • 打赏
  • 举报
回复
UDP是不可靠的,确保不丢包,可以使用TCP,这有socket源码,你可以对照参考: http://download.csdn.net/detail/geoff08zhang/4571358

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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