select()函数的一个奇怪现象

秀小川 发布于 2014/06/05 10:02
阅读 206
收藏 0
DWORD	WINAPI	CCMPPAPI::thread_recv( LPVOID pdata)
{
...
	for(;;)
	{
        FD_ZERO( &fdset);
        FD_SET( cmpp._soc, &fdset);
		err = select(
			0,
			&fdset,
			NULL,
			NULL,
			&timeout);
		//	出错
		if( err == SOCKET_ERROR)
        {
            #ifdef _DEBUG
				cout<<"Socket 等待数据错误.错误代码 = "<<WSAGetLastError()<<endl<<endl;
            #endif
			continue;//break;
        }
		//	超时
		if( err == 0)
			continue;
		//	先接收包头部分,以确定包的大小、类型
 		err = cmpp._recv( (char *)&_CCMPPAPI->m_pkg.head, sizeof( _CCMPPAPI->m_pkg.head));
		if(err == 0) //TODO
			continue;
		if( err != sizeof( _CCMPPAPI->m_pkg.head))
        {
            #ifdef _DEBUG
				cout<<"接收返回值=" <<err<<",长度 = "<<sizeof( _CCMPPAPI->m_pkg.head)<<", 错误 = ,"<<WSAGetLastError()<<endl<<endl;
            #endif
            continue;//break;
        }
		//	接收包体
		err = cmpp._recv( _CCMPPAPI->m_pkg.data, ntohl( _CCMPPAPI->m_pkg.head.size )-sizeof( _CCMPPAPI->m_pkg.head));
		if( err == SOCKET_ERROR)
        {
            #ifdef _DEBUG
				cout<<"Socket 等待数据错误.错误代码 = "<<WSAGetLastError()<<endl<<endl;
            #endif
			continue;//break;
        }
  ...
}



这是一个客户端程序,登录上服务器以后没问题,一旦进行一次通信,select函数返回就不正常了.这里的select一直返回是1, 我另外一段的服务器就算关闭的, 这边select也返回1, 是什么个情况,
加载中
1
七合一的那只小金刚
七合一的那只小金刚

select返回表示有事件发生,下一步用recv处理,从返回值判断是接收到数据还是异常了。

Select在Socket编程中还是比较重要的,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。

0
秀小川
秀小川
 来人给解答下啊!
返回顶部
顶部