此问题已经问过,不过仍然没有解决!!,忍痛新开贴!
背景:
   
1、client端采用阻塞模式给server发数据(设置超时5秒);
2、server端采用网络事件触发来接收client端的数据!client端代码框架:
      while(第一种包没有发完)
      {
       sendto(local,buf....)
       read=recvfrom(local,AckBuf....)
       if(read>0)       
       {
          处理收到的数据;
       }
      }
      while(第二种包没有发完)
      {
          sendto(local,buf....)
       read=recvfrom(local,AckBuf....)
       if(read>0)       
       {
          处理收到的数据;
       }      }
       ......
       ......
       }    
现象:
     1、client端,采用“一发一收”也就是:
      while(包没有发完)
      {
       sendto(local,buf....)
       recvfrom(local,AckBuf....)
       ......
       ......
       }
       在server端只能收到第一个包,后续的包就收不到!!!
   
    2、如果客户端光发不收,server端就能收到client端的所有包,怀疑是recvfrom的问题?!!    3、但是client端跟踪调试,所有的数据、参数,能看到的东西都是正常的!!!
问:可能是哪里的问题???

解决方案 »

  1.   

    client端,采用“一发一收”也就是:
          while(包没有发完)
          {
           sendto(local,buf....)
           recvfrom(local,AckBuf....)
           ......
           ......
           }
    你是说把recvfrom(local,AckBuf....)去掉就发送正常?那么不去掉接收正常吗?
      

  2.   

    是的,如果把recvfrom去掉就发送正常了!!1不去掉,第一个包接收也正常!,但是后续的包server端就收不到我的数据了,更谈不上接收了!!!
      

  3.   

    to: ber() ( ) 信誉:105 是的,如果把recvfrom去掉就发送正常了!!1不去掉,第一个包接收也正常!,但是后续的包server端就收不到我的数据了,更谈不上接收了!!!  
      

  4.   

    UDP数据包丢失很正常,如果一个包丢失你这个程序肯定就完蛋了,因为这样客户端和服务器都在等对方发包。
    我想可以用下面方法来解决:
    增加确认机制,即对每个包都要进行收到确认,如果超过指定时间末收到确认则认为是丢失,你要重发这个包。
      

  5.   

    我觉得你的问题可能是阻塞在这儿了:
    recvfrom(local,AckBuf....)两种可能:一是服务器发关回来的数据包丢失了,二是服务器发送数据的这部分有问题
      

  6.   

    我觉得你的问题可能是阻塞在这儿了:
    recvfrom(local,AckBuf....)什么意思?!!
    我设置了,接收超时啊!!怎么会阻塞呢,况且我调试的时候,也会往下走啊!!!
      

  7.   

    调试的时候客户端recvfrom(local,AckBuf....)接收到的数据正常吗?还有调试时服务器端接收正常吗?要是能调试服务器端的话也可以调试一下看看 :)
      

  8.   

    SOCKET ShareInfoSock=socket(AF_INET,SOCK_DGRAM,0);
    if(ShareInfoSock==INVALID_SOCKET)
    {
    AfxMessageBox("ShareInfoSock Create failed!");
    closesocket(ShareInfoSock);
    } sockaddr_in local;
    local.sin_family=AF_INET;
    local.sin_port=htons(6000);//6000端口    
    local.sin_addr.s_addr=0;

    if(SOCKET_ERROR==bind(ShareInfoSock,(const sockaddr*)&local,sizeof(sockaddr)))
    {
    AfxMessageBox("ShareInfoSock Bind failed!");
    closesocket(ShareInfoSock);
    } sockaddr_in ser;
    ser.sin_addr.S_un.S_addr=inet_addr("192.168.0.104");
    ser.sin_family=AF_INET;
    ser.sin_port=htons(SERVER_PORT);
    //设置接收数据超时 5秒
        int TimeOut = 5000;
    ::setsockopt(ShareInfoSock, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut));
        //...................
        //打包数据!
         while(包没有发完)//已知文件信息没有发送完!
    {  

    //发送该包
    sendto(ShareInfoSock,KnowFilePacket,sizeof(KnowFilePacket),0,(const sockaddr*)&ser,len);

    //处理接收回应包!
    char cRecvKnowFileAck[4096];
    memset(cRecvKnowFileAck,0,4096);
    iRead=recvfrom(ShareInfoSock,cRecvKnowFileAck,sizeof(cRecvKnowFileAck),0,(sockaddr*)&ser,&len);
    if (iRead>0)
    {
      处理包;
    }
    .........
      

  9.   

    建议不设置端点,用DEBUG方式运行,同时打印出DEBUG信息。这样就可以更真实的模拟出接受的环境