BOOL rtc = cUdpSocket->Create(localPort,SOCK_DGRAM);
if(rtc == FALSE)
{
int nErr = GetLastError();
return nErr;
}cUdpSocket->AsyncSelect(FD_READ|FD_CLOSE);
cUdpSocket->Connect(remoteHostName, remotePort);
------------------------------------------
以上代码是我创建UDP Socket的代码int rtc = 0;
rtc = Send(lpBuf, nBufLen, nFlags); 
if(rtc == SOCKET_ERROR)
{
       rtc = this->GetLastError();
}
return rtc;
----------------------------------------
以上是发送的代码
结果运行一段时间以后,Send数据包过去,对方没反应,但是我Send函数也不报错,可是我却能收到对方发过来的数据包,这是怎么回事?

解决方案 »

  1.   

    你的数据报大小是多少?最好不要超过512字节。
       
       网络错误一般是通过recv函数来捕获的。可以在recv函数后边捕获网络错误   我估计是他服务器端的问题,配合调试一下
      

  2.   

    有的可以收到?有的不可以收到?   1.把服务器端的socket recv buffer(SO_RCVBUF) 缓冲区改大一点。如果服务器端socket recv buffer不够大的情况下可能会丢包。
       另外如果发送端发送数据过快,接收端接收数据慢(可能正在处理其他数据)。接受缓冲区满后
    udp是会直接将后来的数据丢弃的,因为udp不使用滑动窗口来协调双方发送和接受速度。
       这样只能缓解丢包率(检查一下客户端机器是否比服务器端快,另外服务器的编写方式不好也可能造成没有及时从socket 缓冲区接收数据,导致缓冲区满)   2.也有可能是一小部分数据包在客户端,就被丢弃了;或者被服务器端的网络接口卡丢弃了。   3.总之,局域网之内发生很小的丢包率是正常的。丢包后需要客户端重新发送数据
      

  3.   

    用WSAGetLastError看看,好象GetLastError不会返回winsock的错误号。
      

  4.   

    在send数据时应查看返回值rtc,如果不是SOCKET_ERROR,那么就是当前发送出去的字节数,如果
    rtc小于nBufLen,那么表明数据未完全发送出去,需将剩下的数据继续发送,直至全部数据发送完为止。
      

  5.   

    楼上说错了吧,在udp情况下每次收发都是一个完整的数据报,或者就是根本就没有接受到数据报,那就表示数据报丢失了。
      

  6.   

    结果运行一段时间以后,Send数据包过去,对方没反应,但是我Send函数也不报错,可是我却能收到对方发过来的数据包,这是怎么回事?对方没反应有两种情况,1,数据报丢了,你要重发;2,数据报被它接受了,但是可能他的代码写错了。send函数是不会报错的,即使对方没有udp端口在监听,因为send函数只是将应用程序的数据拷贝到网卡发送缓冲区,并不代表应用程序数据已经发出,或者对方进程已经收到你收到对方发过来的数据报了,是吗?这个数据报是怎么产生的?
    如果你收到的这个数据报,是因为对方相应了你发过去数据报,那就说明他受到了你的数据报。
    如果你收到的这个数据报,是对方主动发给你的,我就晕了,呵呵还是用wireshark抓一下包
      

  7.   

    TCP的才可以Send.
    UDP的只能sendto
      

  8.   

    udp在 调用过connect函数后,是可以用send,recv一类的函数的
      

  9.   

    哦,搞错了,我用的是API,send就是指TCP而不是UDP,所以才那么说,对不住大家了。