先简单说明,程序是win32 控制台程序
1 创建IO完成端口
2 创建处理线程
3 将处理线程与IO完成端口关联
4 主线程用来处理socket,基本流程伪代码如下:
listen
while(true)
{
.....
Socket acceptSocket= accept(...);
WSARecv( acceptSocket); //或者ReadFile(acceptSocket)
// 使用这两个函数接收数据是,在创建处理线程中调用GetQueuedCompletionStatus
// 该函数使得线程睡眠。当socket有函数接收时激活线程。
.....
}
问题出在while循环处了,如果主线程运行一个死循环,那么就没机会输入字符串。
如果将死回换,改为while(getch()!='y'),虽然可以通过输入y来退出程序,但每次循环都需要输入一个字符才能够执行下去,但是这样不符合服务器程序的特点。服务端应该,程序运行起来,就不再需要人来控制了。只要在某些时刻能做一些操作就行了,比如过一段时间了输入y,程序就能退出了。
现在就死既保留while(TRUE)有能够在某一时刻输入字符。
试了一种办法,开启另一个线程专门负责IO,貌似搞不定。
我建议你看下 SDK 下的 IOCP 的示例程序,目录是 netds/winsock/iocp。
需要一个event来暂停线程,主要accept后,由处理线程来发送信号然后主线程继续