udp通讯程序的问题.大家帮我分析一下
写了一个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




