当前位置: 技术问答>linux和unix
socket通信时,select一直返回超时的问题
来源: 互联网 发布时间:2016-02-24
本文导语: 在使用socket进行udp时,出现这么一个问题: 如果先建立发送端,再建立接收端,正常。 如果先建立接收端,再建立发送端,则出现异常,接收端的select函数一直返回0,即超时了。 发送端一切正常,在Window下运行的其它监...
在使用socket进行udp时,出现这么一个问题:
如果先建立发送端,再建立接收端,正常。
如果先建立接收端,再建立发送端,则出现异常,接收端的select函数一直返回0,即超时了。
发送端一切正常,在Window下运行的其它监视程序,可正常接收到发送端发送的数据。
烦请大家帮忙分析一下,谢谢!
接收端的相应代码如下:
//socket 接收线程
//创建的socket通过参数args传递
static void* SocketRecvHandle(void* args)
{
SOCKET_RECV_S *pSocket = NULL;
unsigned char RecvBuff[RPT_MAX_PACKET_BUFF];
struct sockaddr from;
struct timeval tv;
unsigned int from_len = 0;
unsigned int nRet = 0;
unsigned int nByteRecv = 0;
fd_set readfds;
if (NULL == args)
{
printf("Socket recv thread create error. pass null para.n");
return NULL;
}
pSocket = (SOCKET_RECV_S*) args;
from_len = sizeof(struct sockaddr);
if (pSocket->socket == 0)
{
printf("Socket recv thread create error. no active socket.n");
return NULL;
}
pSocket->runState = RTP_RUNSTATE_RUNNING ;
while (pSocket->runState == RTP_RUNSTATE_RUNNING)
{
tv.tv_sec = 0;
tv.tv_usec = 50000;
memset(RecvBuff, 0, RPT_MAX_PACKET_BUFF);
FD_ZERO(&readfds);
FD_SET(pSocket->socket, &readfds);
nRet = select(pSocket->socket + 1, &readfds, NULL, NULL, &tv);
if (nRet == -1)
{
printf("Socket recv select error. %s", strerror(errno));
}
else if (nRet == 0)
{
printf("Socket recv select timeout. %s", strerror(errno));
}
else
{
if (FD_ISSET(pSocket->socket, &readfds))
{
//socket 接收到数据
//……
}
else
{
printf("Socket unknown error. ");
}
}
}
return NULL;
}
|
May be the follow can be deal with your probelem. But i am not sure.
just try it:)
befor:
else
{
if (FD_ISSET(pSocket-> socket, &readfds))
{
//socket 接收到数据
//……
↓
after:
else if ( (ret > 0) && (FD_ISSET(pSocket-> socket, &readfds)) )
{
if (FD_ISSET(pSocket-> socket, &readfds))
{
//socket 接收到数据
//……
just try it:)
befor:
else
{
if (FD_ISSET(pSocket-> socket, &readfds))
{
//socket 接收到数据
//……
↓
after:
else if ( (ret > 0) && (FD_ISSET(pSocket-> socket, &readfds)) )
{
if (FD_ISSET(pSocket-> socket, &readfds))
{
//socket 接收到数据
//……
|
"如果先建立接收端,再建立发送端,则出现异常,接收端的select函数一直返回0,即超时了。"
在这种建立的循序下,接收端很有可能会发生超时的。因为楼主设的超时时间是50毫秒。我不知道搂住所谓的在Window下运行的其它监视程序的超时时间是多长?也是50毫秒吗?
在这种建立的循序下,接收端很有可能会发生超时的。因为楼主设的超时时间是50毫秒。我不知道搂住所谓的在Window下运行的其它监视程序的超时时间是多长?也是50毫秒吗?
|
接收超时时间设置的太小