免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1916 | 回复: 6
打印 上一主题 下一主题

[C++] 请教关于while循环无法退出的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-09 21:20 |只看该作者 |倒序浏览
情况是这样:
主程序中有一个ConnectTo方法用于连接服务器并接收数据,其后有一个Close方法用于断开服务器连接,但是由于ConnectTo方法中用到while循环接收数据,处于阻塞状态,其后的Close方法就无法执行了,请问该如何处理呢?
附上代码如下:
// 连接服务器方法
void ConnectTo(char *address,int port) {

m_address=address;
m_port=port;

hStartEvent = ::CreateEvent(0,FALSE,FALSE,0); //create thread start event
if(hStartEvent == 0)
{
  printf("create start event failed,errno:%d\n",::GetLastError());
  WSACleanup();
}
fire_event_thread_handle = CreateThread(NULL,0,FireEventThread,(LPVOID)this,0,&fire_event_thread_id);   
printf("Thread start...\n");

::WaitForSingleObject(hStartEvent,INFINITE);
CloseHandle(hStartEvent);

printf("Start connect to server\n");
Init();
printf(address);
printf(":%d\n",port);

ClientService.sin_family = AF_INET;
ClientService.sin_addr.s_addr = inet_addr(address);
ClientService.sin_port = htons(port);
// connect
connect(m_socket,(SOCKADDR*)(&ClientService),sizeof(ClientService));
WSANETWORKEVENTS NetworkEvents;
while (true)
{
  //Wait for network events on all sockets
  WSAWaitForMultipleEvents(1,&NewEvent,FALSE,WSA_INFINITE,FALSE);
  
  WSAEnumNetworkEvents(m_socket,NewEvent,&NetworkEvents);
  
  // CONNECT
  if (NetworkEvents.lNetworkEvents & FD_CONNECT)
  {
   //处理
  }
  
  // READ(RECV)
  if (NetworkEvents.lNetworkEvents & FD_READ)
  {
   //处理
  }
  // WRITE
  if (NetworkEvents.lNetworkEvents & FD_WRITE)
  {
   //处理
  }
  
  // CLOSE
  if (NetworkEvents.lNetworkEvents & FD_CLOSE)
  {     
   //处理
  }
}
}
// 断开服务器方法
void Close()
{
//断开服务器连接
}
//主程序
main()
{
//...
ConnectTo("127.0.0.1",5050);
Close();//执行不到了?怎么办?
}

论坛徽章:
0
2 [报告]
发表于 2008-07-09 21:32 |只看该作者
在while循环里面,给WSAWaitForMultipleEvents(1,&NewEvent,FALSE,WSA_INFINITE,FALSE);加上超时。

如果超时了,就break出while循环。

论坛徽章:
0
3 [报告]
发表于 2008-07-09 22:14 |只看该作者

回复 #2 wwwsq 的帖子

但客户端是要根据自己的需要选择何时断开和服务器的连接的,
设置超时时间不太合适吧。

论坛徽章:
0
4 [报告]
发表于 2008-07-09 22:18 |只看该作者
那就搞个全局变量的标志,while那里判断

论坛徽章:
0
5 [报告]
发表于 2008-07-09 22:25 |只看该作者

回复 #3 tnt121 的帖子

那客户永远不断开,你就永远block在那里了。

论坛徽章:
0
6 [报告]
发表于 2008-07-09 22:50 |只看该作者

回复 #5 wwwsq 的帖子

是个问题啊
4楼说的设置全局变量的方法也试过,
比如设置一个isRun初始化为true
然后循环while(isRun),只要把isRun修改为false就可以退出循环了
但是这个方法一直阻塞着,这个全局变量怎么根据需要在这个方法外来改变呢?

论坛徽章:
0
7 [报告]
发表于 2008-07-09 22:53 |只看该作者

回复 #6 tnt121 的帖子

另外起个线程,在那个线程里面修改isRun。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP