CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

udp通讯程序的问题.大家帮我分析一下

楼主lijin6249(lijin6249)2006-07-04 09:51:41 在 VC/MFC / 网络编程 提问

写了一个udp通讯的程序,发现我在向外边发送消息的时候,如果外面有接收这条消系的程序,那么一切正常.如果我不去接收它,那么,我自己的接收线程会报错!  
   
  错误就是 lRetVal=   recvfrom(   m_lSocket,   pRecvBuf,   MAX_UDP_MSG_LEN,   0,   (struct   sockaddr*)&tDestAddr,   &lAddrLen   );  
  这句返回值为   -1.  
   
  谁知道这是怎么回事?? 问题点数:60、回复次数:9Top

1 楼jacklzw88(不可爱咯)回复于 2006-07-04 10:02:32 得分 0

recvfrom会无限等待,你这样做Top

2 楼tiewen(铁文)回复于 2006-07-04 10:04:10 得分 0

SOCKET_ERRORTop

3 楼lijin6249(lijin6249)回复于 2006-07-05 14:35:17 得分 0

我的函数是这样的:  
   
  INT32   CMySocket::RecvFrom(   INT8*   pRecvBuf,   UINT32&   lRecvLen,   UINT32&   lDestIP,   UINT32&   lDestPort   )  
  {  
  UINT32                                 lIP;  
  UINT32                                 lPort;  
  INT32                                   lRetVal=   0;  
  struct   timeval                 tTimeOut;  
  fd_set                                 tReadFd;  
  sockaddr_in                       tDestAddr;  
  #if   defined(WIN32)  
  INT32                                   lAddrLen;  
  #elif   defined   (_SXPLAT_REDHAT_)   ||   defined(_SXPLAT_AIX_)  
  socklen_t                           lAddrLen;  
  #else  
  UINT32                                 lAddrLen;  
  #endif  
   
  if   (   m_lSocket   ==   0   )  
  return   -1;  
   
  if   (   m_cSocketType   !=   SOCK_TYPE_UDP_SOCKET   )  
  return   -2;  
   
  if   (   lRecvLen   <=   0   )  
  return   -4;  
   
  lIP=   (   lDestIP==0   )   ?   m_lDestIP   :   lDestIP;  
  lPort=   (   lDestPort==0   )   ?   m_lDestPort   :   lDestPort;  
   
  INT16   i;  
  for   (   i=   0;   i<m_lRetryTimes   &&   !m_bExitFlag;   i++   )  
  {  
  tTimeOut.tv_sec     =   m_lSelectTime;  
  tTimeOut.tv_usec   =   0;  
  FD_ZERO(   &tReadFd   );  
  FD_SET(   (UINT32)m_lSocket,   &tReadFd   );  
   
  //等待数据到达  
  lRetVal=   select(   m_lSocket+1,   &tReadFd,   NULL,   NULL,   &tTimeOut   );  
   
  if   (   lRetVal   ==   0   ||   m_bExitFlag   )  
  continue;  
   
  if   (   lRetVal   <   0   )  
  {  
  Close();  
  lRetVal=   -5;  
  break;  
  }  
   
  if   (   FD_ISSET(   m_lSocket,   &tReadFd   )   )  
  {  
  lAddrLen=   sizeof(   sockaddr_in   );  
  if   (   lIP   !=   0   )  
  {  
  tDestAddr.sin_addr.s_addr   =   lIP;  
  tDestAddr.sin_port                 =   htons(   (UINT16)lPort   );  
  tDestAddr.sin_family             =   AF_INET;  
  }  
  else  
  memset(   &tDestAddr,   0,   lAddrLen   );  
   
  lRetVal=   recvfrom(   m_lSocket,   pRecvBuf,   MAX_UDP_MSG_LEN,   0,   (struct   sockaddr*)&tDestAddr,   &lAddrLen   );  
   
  if   (   errno   ==   EWOULDBLOCK   ||   errno   ==   ENOBUFS   ||   errno   ==   EAGAIN   )  
  continue;  
   
  if   (   lRetVal   <   0   )  
  {  
  MYSOCKPRINT(   "ERROR:   CMySocket::RecvFrom->recvfrom()   [%s]\n",   strerror(   errno   )   );  
  Close();  
  lRetVal=   -6;  
  break;  
  }  
   
  lDestIP=   (UINT32)tDestAddr.sin_addr.s_addr;  
  lDestPort=   (UINT32)ntohs(   tDestAddr.sin_port   );  
   
  lRecvLen=   lRetVal;  
  pRecvBuf[   lRecvLen   ]   =   '\0';  
   
  lRetVal=   lRecvLen;  
  break;  
  }  
  }//for  
   
  if   (   i   ==   m_lRetryTimes   )  
  return   0;  
   
  return   lRetVal;  
  }  
   
  屏幕上打印的SOCKET_ERROR是NO   ERROR  
   
  Top

4 楼terrysandy(起航邀月)回复于 2006-07-05 15:17:58 得分 60

你发送的数据没有人接收,所以回返回错误,这个错误就被你的接收线程收到了Top

5 楼aiyue2010(亚伦)回复于 2006-07-05 16:28:53 得分 0

GetLastError看看错误代码就知道是什么错误了Top

6 楼nuaawenlin(飘人)回复于 2006-07-05 19:10:57 得分 0

WSAGetLastError看看错误代码Top

7 楼chensj_bj(嘻嘻)回复于 2006-07-07 10:16:34 得分 0

错误代码如何察看阿?怎么才知道啊?Top

8 楼lijin6249(lijin6249)回复于 2006-07-11 17:14:44 得分 0

WSAGetLastError没有错误.terrysandy(起航邀月)说的好象是那么回事,但是如果改正呀!能不能接着把修改方法告诉我Top

9 楼lijin6249(lijin6249)回复于 2006-07-20 14:04:33 得分 0

看来没有人说了.而且问题我也解决了.感谢terrysandy(起航邀月兄弟!给了我灵感.Top

相关问题

关键词

得分解答快速导航

  • 帖主:lijin6249
  • terrysandy

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo