一个循环不停的发 一个不停的手 - -
都只有一个循环
结果总会丢几个 - -
要是接受的程序 在循环里头做点别的事情。。丢的更多
开始已经 是接受缓冲区的问题。。
已经把缓冲区设置成发送的数据大小了。 。
结果还是丢- - 
这啥回事
包都发送过去了- -

解决方案 »

  1.   

    程序非常简单
    一个
    for(int i = 0;i<10000;i++)
    {
       sendto()
    }一个
    for(int i = 0;i<10000;i++)
    {
    /*如果这里进行了一些操作 丢包更多*/
       recvfrom();
    }
      

  2.   

    发的太快,当然会丢了,建议发送端加延时。
    for()
    {
    sendto();
    sleep(0);
    }
      

  3.   

    for(int i = 0;i<10000;i++)
    {
       sendto()
    Sleep(2);
    }
      

  4.   

    我真正的实现就是收到数据后
    把数据组成一个包 投递到接收队列里头。。
    然后继续接收 
    可是如果sendto非常快的话
    接收方就会丢包。后来我做个测试 也就是上面的例子。。
    发现在for里面发送的话 接收方总会丢包- -
    我已经把接收缓冲区设置成 发送数据的大小了。。可是还是丢
      

  5.   

    我已经用setsockopt设置套接字的接受缓冲区了。。大小和 sendto方 发送的数据一样
      

  6.   

    我本机发本机。。就是缓冲区的复制而已--
    晕死。。
    刚搞的UDP重传策略 把整个公司的TCP应用全部搞掉线了- -
      

  7.   

     - -LS的
    UDP要么发送成功 要么发送失败
    不存在 粘包这个现象
    我发送1KB    接收要么是1KB 要么失败
      

  8.   

    我本机发本机。。就是缓冲区的复制而已--
    ====================================
    我觉得显然不是这样的呀,接收和发送,是异步的,当发的比较慢的时候,当然,接收能够跟上,发的快的情况下,接收跟不上,这有什么奇怪的。就算你不要socket,直接内存复制也存在这个问题。
      

  9.   

    既然是udp,就不要指望发n次一包不丢,局域网不要指望,本机也不要指望。
      

  10.   

    关键是你Recvfrom之后还进行了某些处理吧,这样就引起了sendto快过recvfrom..............
      

  11.   

    收的应该用for(;;)死循环,在里面计数,加上超时就最好;发的加上延时。
      

  12.   

    接收的时候,只管接收.处理在另外的地方.
    比如说你在一个独立的线程里 建立一个list 每接到一个就push进去。然后再另外的线程 处理list的消息。这就比如说 如果有一个碗(缓冲区) 你倒(send)一次 满了。 再倒一次 原来的被覆盖了,洒出来了。 里面还是一碗。那洒出来的就是丢得包。 现在要做的就是 倒进去之后 再把碗里的水,倒到更大的地方,腾出碗来接水。
      

  13.   

    可能是发的太快了,以前我写过一个tcp的程序,服务器发的太快,客户端也是接不过来,本机测试也只能接到后面发的数据。