首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2013-07-04 
Udp 发送成功 但是接收端 没有收到数据包 是为什么? 求关注 求分析 求解答想要实现的是一个UDP推送功能,

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丢包

热点排行