读书人

Udp 发送顺利 但是接收端 没有收到数据

发布时间: 2013-07-04 11:45:51 作者: rapoo

Udp 发送成功 但是接收端 没有收到数据包 是为什么? 求关注 求分析 求解答
想要实现的是一个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); }

UDP socket 网络 线程
[解决办法]
UDP是不可靠的,确保不丢包,可以使用TCP,这有socket源码,你可以对照参考:
http://download.csdn.net/detail/geoff08zhang/4571358
[解决办法]
代码乱得没法看,还是C#的。不过建议你在SendTo之前检查一下发送的地址是否有效。
[解决办法]
udp通信比较简单,相信你的代码不会有太大问题。
可能是外部原因,比如防火墙
[解决办法]
应该是防火墙的问题吧
[解决办法]
防火墙、网络带宽、360都可能造成UDP丢包

读书人网 >VC/MFC

热点推荐