求解: 非阻塞模式socket的问题

hyamw 2004-02-03 09:30:45
照着资料写了一个非阻塞模式的通讯程序:
Server线程:
FD_SET(LitenSocket,&readfs);
FD_SET(ListenSocket,&exceptfs);
timeout.tv_sec=0;
timeout.tv_usec=0;
while(1)
{
if(select(0,&readfs,&writefs,&exceptfs,&timeout)!=0)
if(FD_ISSET(ListenSocket,&readfs))
{
ConnectionSocket=accept(ListenSocket,&saddr,(int FAR*)&len);
FD_SET(ConnectionSocket,&readfs);
do
{ //(#)如果服务器执行到在这里先暂停,不进行检测
if(select(0,&readfs,&writefs,&exceptfs,&timeout)!=0)
if(FD_ISSET(ConnectionSocket,&readfs))
{
result=recv(ConnectionSocket,(char*)buff,MAX_SIZE,0))!=SOCKET_ERROR;
if(result!=0&&result!=SOCKET_ERROR)
{
.............
}
}
}while(result!=SOCKET_ERROR&&result!=0);
FD_CLR(ConnectionSocket,&readfs); closesocket(ConnectionSocket);
}
}//中间还有一些结束线程的部分就不写了

Client线程:

.....
FD_SET(ConnectSocket,&readfs);
FD_SET(ConnectSocket,&writefs);
do
{
//(*)这里有问题
if(select(0,&readfs,&writefs,&exceptfs,&timeout)!=0)
if(FD_ISSET(ConnectSocket,&readfs)||FD_ISSET(ConnectSocket))
{
if((result=recv(ConnectSocket,(char*)buff,MAX_SIZE,0))==SOCKET_ERROR)
//如果接收数据错误,则提示
MessageBox(m_hWnd,"接收数据错误!","提示:",MB_OK);
else
if(result!=0) {
...............
}
}
}while(result!=SOCKET_ERROR&&result!=0);

//省略了一部分不重要的

如上程序,在调试过程中发现,客户端能连接到服务器,但是客户端进入线程开始
检查数据否有消息的时候(*)处不管服务器有没有发送数据过来,都检测到有数据
(此时服务器已经进入了第二次循环,也在不停的检测是否有数据)。在调试过程中
没有暂停服务器的话,客户端每次检测都能检测到有数据,然后进行接收,结果recv的结果是0;按资料上说的result==0的话,是连接中断了,自然就结束了线程。
如果调试过程中服务器执行到(#)处,先中断调试,客户端在检测FD_ISSET(ConnectSocket,&readfs)的结果就不再是有数据了。

所以我觉得select函数在检测的过程中会向对方发送检测信号,而对方收到检测信号的时候FD_ISSET(s,&readfs)会认为有数据发送过来,结果就出现了这个问题。(请高手指点)

难道说非阻塞模式的C/S模型只能用于单方面发送单方面接受?
...全文
46 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyamw 2004-02-03
  • 打赏
  • 举报
回复
不up了,我搞定了
karlson0211 2004-02-03
  • 打赏
  • 举报
回复
接分,呵呵:)
兄弟,我在学非阻塞模式socket的问题,你的代码好长,看了都头大, 做个记号,慢慢看.
帮你顶一下!
hyamw 2004-02-03
  • 打赏
  • 举报
回复
竟然没人来 55555555555

散分,第一个进来的给分

18,356

社区成员

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

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