winsock编程 关于select函数为什么总返回0?

winsockmfc 2008-04-19 04:04:43
代码如下:问题在//***********后面



DWORD WINAPI SelectThread(LPVOID pParam)
{
if(pParam == NULL)
{
#ifdef _DEBUG
::MessageBox(NULL, "结束10 select thread !", "Message Box", MB_OK);
#endif
return 0;
}
//得到传递的参数
CMyTCPSocketUser * pSocket = (CMyTCPSocketUser *)pParam;

int n;
struct fd_set readfds;
int socket;
struct timeval Timeval;
CString temp;
CString temp1;



//进入无限循环,直到主线程结束
while(true)
{
::MessageBox(NULL, "4444444444455555555555!", "Message Box", MB_OK);
if(::g_bOverThread == true)
{
#ifdef _DEBUG
::MessageBox(NULL, "结束11 select thread !", "Message Box", MB_OK);
#endif
return 1;
}
DWORD word = ::WaitForSingleObject(::g_handle[1], 0);
if(word == WAIT_OBJECT_0)
{
#ifdef _DEBUG
::MessageBox(NULL, "结束12 select thread !", "Message Box", MB_OK);
#endif
return 1;
}

socket = pSocket->GetSocket();
temp1.Format("%d",socket);
::MessageBox(NULL, temp1, "Message Box", MB_OK); //***********此处显示了socket为某一正整数(如1844)
if(socket)
{
FD_ZERO(&readfds);
FD_SET(socket, &readfds);
Timeval.tv_sec = 5;
Timeval.tv_usec = 0;

n = ::select(0, &readfds, NULL, NULL, &Timeval);

temp.Format("%d",n);
::MessageBox(NULL, temp, "Message Box", MB_OK); //***************总是返回0,为什么?
if(n == SOCKET_ERROR)
{
#ifdef _DEBUG
::MessageBox(NULL, "Select 失败 !", "Messsage Box", MB_OK);
#endif
return 0;
}

if(n == 1)

{
::MessageBox(NULL, "5555555555555555!", "Message Box", MB_OK);
if(FD_ISSET(socket, &readfds))
{
#if 1
::MessageBox(NULL, "fgfdgdddddddddddddddd", "Message Box", MB_OK);
//{{可读, 发送消息 UM_READABILITY
CClientApp * pwnd = (CClientApp *)::AfxGetApp();
::SendMessage(pwnd->m_pMainWnd->m_hWnd,
UM_READABILITY,
NULL,
NULL);
//}}可读, 发送消息 UM_READABILITY
#else
//{{可读, 发送消息 UM_READABILITY
CChat_ClientApp * pwnd = (CChat_ClientApp *)::AfxGetApp();
::PostMessage(pwnd->m_pMainWnd->m_hWnd,
UM_READABILITY,
NULL,
NULL);
//}}可读, 发送消息 UM_READABILITY
#endif
}
}
}
}
}
...全文
1139 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2008-04-20
  • 打赏
  • 举报
回复
没有数据来当然返回0;你服务端关闭倒是会发一个包过来。
winsockmfc 2008-04-19
  • 打赏
  • 举报
回复
这是客户端
  • 打赏
  • 举报
回复
你这是服务器?
要是服务器咋没看见accept,还应该将accept的返回值添加到 readfds里面
winsockmfc 2008-04-19
  • 打赏
  • 举报
回复
按照正常的情况,应该是客户端的select第一次返回1,表示已经和服务器连接上?
然后返回0,等待发送数据,每次有数据发送就返回1,否则返回0,可是这第一次就返回0了。。很是纳闷。。
  • 打赏
  • 举报
回复
读事件这个是不确定的
你怎么知道对方一定在某个时间内发送数据过来?
winsockmfc 2008-04-19
  • 打赏
  • 举报
回复
首先谢谢你的回复。
我的意思就是说有>0,0,错误三种情况,可是现在为什么会到超时还没有发现可读的事件呢?FD_SET(socket,&readfds)不是已经把socket加进去了吗?是参数的问题还是什么的问题呢?
  • 打赏
  • 举报
回复
你怎么看的哪么多说明?
msdn上面只说明了,大于0,等于0,以及 SOCKET_ERROR
0就是超时
大于0就是有socket事件,这个得你自己用FD_ISSET去判断那个socket有事件
SOCKET_ERROR 就是错误,停止select


当把服务端关闭,这边客户端的select就返回1,这又是为什么?
对与客户端而言,服务器关闭的时候客户端会产生一个读事件,
但你读取不到任何东西,这个时候表示服务器关闭了
winsockmfc 2008-04-19
  • 打赏
  • 举报
回复
我搜过好多帖子,有的说是防火墙有问题,我把防火墙都关了还是(开始返回0,把服务器关了返回1),还有说是超时设置的不对,我设过10毫秒,5秒,60秒,都不行,把最后一个参数设为NULL也不行,这到底是为什么呢?
winsockmfc 2008-04-19
  • 打赏
  • 举报
回复
我也看过msdn,select返回大于0表示有文件可读,如果没有则根据timeout判断是否超时,超时则返回0,出错返回SOCKET_ERROR,可是前面返回的socket值没有什么不对呀,为什么还返回0呢? 还有一点:当把服务端关闭,这边客户端的select就返回1,这又是为什么?
Torch009 2008-04-19
  • 打赏
  • 举报
回复
csdn也没msdn好,楼主msdn吧
  • 打赏
  • 举报
回复
看select的返回值说明

The select function returns the total number of socket handles that are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧