自己写了一个简单的UDP包发送和接收程序,虽然程序很简单但是遇到了一个难题. 当我把包的大小设置为5760, 发送时间间隔为5ms时. 接收端总是接收不到数据只有当发端发送结束后才能接收到最后发送的几个数据包.问题奇怪的时我用tcpdump监控显示到达的UDP包远远大于socket接收到的那些。这个问题折腾了好长时间了。试着改用windows程序接收也有同样的问题。 是不是我的TCP/IP 协议的某个参数设置的不够大。谢谢啦!

解决方案 »

  1.   

        理论上来说,udp是不保证不丢包的,但是也不应该出现你这种情况
        你还是简单的贴下代码吧,也方便别人查找原因
      

  2.   

    发送端的codepublic static void main(String[] args) {
    byte[] buffer = null;
    int sequenceNumber = 0;
    DatagramSocket socket = null;
    try {
     socket = new DatagramSocket(41112, InetAddress.getByName("10.3.6.248"));
    } catch (SocketException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    int count = 0;
    while(count < 1000){
    buffer = getDataBuffer(sequenceNumber++,
    5760);
    // TODO Auto-generated method stub
    try {
    //if(count == 500){
    // Thread.sleep(1000);
    //}
    DatagramPacket datagramPacket = new DatagramPacket(buffer,
    buffer.length, InetAddress.getByName("172.32.55.102"), 41112);
    socket.send(datagramPacket);
    System.out.println("count send = " + count++);
    System.out.printf("%x %x %x %x \n", datagramPacket.getData()[0],datagramPacket.getData()[1],datagramPacket.getData()[2],datagramPacket.getData()[3]);
    Thread.sleep(1000/20);
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    socket.close();
    }接收端:
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    final  int MAX_PACKET_SIZE = Short.MAX_VALUE;
    byte[] buffer = new byte[MAX_PACKET_SIZE];
    DatagramPacket datagramPacket = new DatagramPacket(buffer, MAX_PACKET_SIZE);
    DatagramSocket datagramSocket =null;
    try {
    datagramSocket = new DatagramSocket(41112, InetAddress.getByName("10.3.6.227"));
    datagramSocket.setTrafficClass(8);
    //datagramSocket.setSoTimeout(100);
    //datagramSocket.setReceiveBufferSize(MAX_PACKET_SIZE);
    } catch (SocketException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    int count = 0;
    while(true){
    try {
    long sequencenumber = 0;
    datagramSocket.receive(datagramPacket);
    System.out.println("receive packet: length = "+ datagramPacket.getLength()+ " packet count= "+ count++);
    System.out.printf("%x %x %x %x \n", datagramPacket.getData()[0],datagramPacket.getData()[1],datagramPacket.getData()[2],datagramPacket.getData()[3]);
    //sequencenumber |= datagramPacket.getData()[0]<<24 |datagramPacket.getData()[1]<<16 |datagramPacket.getData()[2]<<8 |datagramPacket.getData()[3];
    //System.out.println("sequence number = " + sequencenumber);

    } catch (IOException e) {
    // TODO Auto-generated catch block
    //e.printStackTrace();
    System.out.println("time out");

    }
    } }
      

  3.   

    接收端打印的log:receive packet: length = 5760 packet count= 0
    0 0 3 e0 
    receive packet: length = 5760 packet count= 1
    0 0 3 e1 
    receive packet: length = 5760 packet count= 2
    0 0 3 e2 
    receive packet: length = 5760 packet count= 3
    0 0 3 e3 
    receive packet: length = 5760 packet count= 4
    0 0 3 e4 
    receive packet: length = 5760 packet count= 5
    0 0 3 e5 
    receive packet: length = 5760 packet count= 6
    0 0 3 e6 
    receive packet: length = 5760 packet count= 7
    0 0 3 e7 
      

  4.   

    tcpdump 抓的包tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
    21:07:03.773220 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5b46 2000 7f11 c601 0a03 06f8  EH..[F..........
            0x0010:  ac20 3766 a098 a098 1688 5a12 0000 0000  ..7f......Z.....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:04.892991 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5b6b 2000 7f11 c5dc 0a03 06f8  EH..[k..........
            0x0010:  ac20 3766 a098 a098 1688 5a03 0000 000f  ..7f......Z.....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:06.193059 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5b8d 2000 7f11 c5ba 0a03 06f8  EH..[...........
            0x0010:  ac20 3766 a098 a098 1688 59f1 0000 0021  ..7f......Y....!
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:10.112874 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5be9 2000 7f11 c55e 0a03 06f8  EH..[......^....
            0x0010:  ac20 3766 a098 a098 1688 59bc 0000 0056  ..7f......Y....V
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:15.312771 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5c66 2000 7f11 c4e1 0a03 06f8  EH..\f..........
            0x0010:  ac20 3766 a098 a098 1688 5975 0000 009d  ..7f......Yu....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:17.952631 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5ca7 2000 7f11 c4a0 0a03 06f8  EH..\...........
            0x0010:  ac20 3766 a098 a098 1688 5951 0000 00c1  ..7f......YQ....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:19.052573 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5cc1 2000 7f11 c486 0a03 06f8  EH..\...........
            0x0010:  ac20 3766 a098 a098 1688 5942 0000 00d0  ..7f......YB....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:21.472571 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5cfa 2000 7f11 c44d 0a03 06f8  EH..\......M....
            0x0010:  ac20 3766 a098 a098 1688 5921 0000 00f1  ..7f......Y!....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:26.912443 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5d7d 2000 7f11 c3ca 0a03 06f8  EH..]}..........
            0x0010:  ac20 3766 a098 a098 1688 58d7 0000 013b  ..7f......X....;
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:28.012260 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5d97 2000 7f11 c3b0 0a03 06f8  EH..]...........
            0x0010:  ac20 3766 a098 a098 1688 58c8 0000 014a  ..7f......X....J
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:30.232506 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5dce 2000 7f11 c379 0a03 06f8  EH..]......y....
            0x0010:  ac20 3766 a098 a098 1688 58aa 0000 0168  ..7f......X....h
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:07:33.412282 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 5e1a 2000 7f11 c32d 0a03 06f8  EH..^......-....
            0x0010:  ac20 3766 a098 a098 1688 587e 0000 0194  ..7f......X~....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx
    21:08:22.130656 IP ms63238.ran3.dynamic.com.41112 > giftp6.site.41112: UDP, leng
    th 5760
            0x0000:  4548 05dc 622c 2000 7f11 bf1b 0a03 06f8  EH..b,..........
            0x0010:  ac20 3766 a098 a098 1688 562b 0000 03e7  ..7f......V+....
            0x0020:  20a2 2e3c 282b 2621 242a 293b 7c2d 2f2e  ...<(+&!$*);|-/.
            0x0030:  255f 3e3f 3a23 4027 3d22 6162 6364 6566  %_>?:#@'="abcdef
            0x0040:  6768 696a 6b6c 6d6e 6f70 7172 7374 7576  ghijklmnopqrstuv
            0x0050:  7778                                     wx从TCPDump的结果也能看到我发送包的内容:0000 03e7 是包内容里的序号sequence 真好对应从socket接收到的最后一个包
      

  5.   

    能不能按照网上udp最简单的例子一点点添加调试呢
      

  6.   

    tcpdump 抓的包
    的包被我删了一部分,太长了开始的几个包都没收到.
    0x0010: ac20 3766 a098 a098 1688 5a12 0000 0000 ..7f......Z.....这个是第一个包序号0000
      

  7.   

    我觉得是不是因为没有flush,数据在缓冲区里,加个flush应该就可以了