我做的是基于RTP\RTSP数据传输,RTP数据传输部分
  struct sockaddr_in s_in;
  *sd = socket(AF_INET,SOCK_DGRAM,0);
  setsockopt(*sd,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(opt));
  s_in.sin_family = AF_INET;
  s_in.sin_addr.s_addr = htonl(INADDR_ANY);
  s_in.sin_port = localport;
  if (bind(*sd,(struct sockaddr *)&s_in,sizeof(struct sockaddr))!= 0)
    printf("UDP socket bind error!");
然后while()
{
  send(rtp_socket,buf,len,0);
}
连接调用send发送文件数据,len<1500,Client端用recvfrom接收,在局域网中运行时不会出错,但架到有路由的网络上后,接收到的远远少于发送的,请各位大虾帮忙解答一下,问题出在哪里,应该怎么修改啊...

解决方案 »

  1.   

    在while中加入sleep(),时间自己控制,这样或许可以满足你的一时之需。
    原理我不清楚,但也治标不治本,坐待问题根本性解决
      

  2.   

    对,丢包了,而且丢的很严重,发出去没有问题,但接收到的东西就有问题了,我想问是不是调用send太频繁,还没发出去,socket缓存中的东西就被覆盖了...
      

  3.   

    普通的UDP并不能保证它不丢包,除非你做保证措施
      

  4.   

    额!那你在while()
    {
      send(rtp_socket,buf,len,0);
    }对Send加一个判定吧!或者先简单地加一个Sleep(50)看看丢包会不会减少
    区域网基本是网络情况最好的环境了,很多问题反应不出来
      

  5.   

    加Sleep是会减轻这种情况,可是这样治标不治本吧,有没更好的办法呀???
      

  6.   

    不是啊,应该不是防火墙的原因,我加了个Sleep,真的情况有改善...
      

  7.   

    sleep时间长点就能传送所有数据了,只是send的包很多的话时间很长,继续坐等……
      

  8.   

    我要传的就是大量的数据,如果Sleep时间太长,不可行啊我也在等...
      

  9.   

    做等根本性解决方案,反正我是sleep()解决掉的,本来我连本机发都接不完整
      

  10.   

    我用的是RTP协议,不知道该怎么做...
      

  11.   

    网卡驱动程序获取到数据,从端口发送出去,这个发送需要个时间的吧。也就是所有这些数据换成脉冲的信号,总需要一个长度的时间。如果放在while循环里面,这个发送频率是很高的,CPU效率越高,速度越快,send只负责把数据放到缓冲区,而网卡驱动层次的发送速度肯定是跟不上的,肯定会把数据覆盖的吧。计算下CPU执行while循环的速度和数据量,在依据网卡的数据,选择sleep一个合适的时间,应该可以呢。猜测啊·~
      

  12.   

    估计丢包了...改成这样试试:  struct sockaddr_in s_in;
      *sd = socket(AF_INET,SOCK_DGRAM,IPPROTO_TCP);
      

  13.   

    放心吧 底层绝对会满足上层使用的 网卡发送速度跟不上 肯定有解决方案的 我这么菜的都能想到好几种UDP经过路由器丢包 应该是正常的事吧
      

  14.   

    呃,好几种??教下,Please!!!!
      

  15.   

    我用的是UDP啊,IPPROTO_TCP这不能用吧...
      

  16.   


    ??你是用的winsock API么??
    那send不是只能发面向连接的包么??
      

  17.   

    有connect啊...我没把所有代码写出来而已...
      

  18.   

    UDP丢包会比较多,你最好使用TCP。
      

  19.   

    我用的是RTP协议,再说,实时传输的话,还是UDP比较好啊...
      

  20.   

    UDP数据得不到保障...
    TCP就好多了...UDP丢包也算正常吧...
      

  21.   

    楼主不如先试下TCP,比较一下,看看是否还丢包,这样可能会排除很多假设。
      

  22.   

    建议使用开源库udt协议,可以从基本上解决问题,udt协议也是基于udp的!
      

  23.   


    你这SOCK_DGRAM,也能用connect????????
      

  24.   

    今天第一次听说,用UDP也能connect,是我孤陋寡闻了?
      

  25.   

    msdn 关于 connect 函数的一段 res
    For a connectionless socket (for example, type SOCK_DGRAM), the operation performed by connect is merely to establish a default destination address that can be used on subsequent send/ WSASend and recv/ WSARecv calls. Any datagrams received from an address other than the destination address specified will be discarded. If the address member of the structure specified by name is all zeroes, the socket will be disconnected. Then, the default remote address will be indeterminate, so send/ WSASend and recv/ WSARecv calls will return the error code WSAENOTCONN. However, sendto/ WSASendTo and recvfrom/ WSARecvFrom can still be used. The default destination can be changed by simply calling connect again, even if the socket is already connected. Any datagrams queued for receipt are discarded if name is different from the previous connect.
      

  26.   

    我说错了OK?SOCK_DGRAM,send也能用啊,又没规定非要用sendto,只发给一个地址的时候,用send也可以啊...
      

  27.   

    UDP也能用connect,看你想怎么用而已啊...
      

  28.   

    len<1500
    ==========================================
    发包小一些,控制在512以内,再试试
      

  29.   

    UDP socket,有两种方式建立结合,一种是先connect再send,另一种直接sendto,前一种适合传送资料给同个网址,后种适合不同网址...
      

  30.   


    真是学习了,真的是第一次知道还能这样,可是这跟MSDN上的说法很不一样啊,明天有空我试试
      

  31.   

    while(1)
    send(rtp_socket,buf,len,0);
    }
    在这个循环里加个sleep(时间)  再创建个线程调用send