有一个监听Socket连接的线程,代码为:
{
while(!pThread->m_bExit)
{
if(listen(m_hSocket, SOMAXCONN) == SOCKET_ERROR)
{
continue;
} SOCKADDR addr;
int addrlen = sizeof(SOCKADDR); SOCKET hSocket = accept(m_hSocket, &addr, &addrlen);
if(hSocket == INVALID_SOCKET)
{
continue;
}
m_lSocket.AddTail(hSocket); Sleep(100);
}
}这个线程运行是会在listen处阻塞,所以在进程退出时把bExit置为true线程也不会退出,我现在采用的方法是先用closesocket(m_hSocket)关闭Socket,这样listen就会立刻返回,但不知道这样会不会有问题。
另外,好象对这种线程有一种使用信号(Event)来控制的方法,听说是最安全的,那位大侠有这方面的经验,给小弟讲讲吧,最好有个例子,谢谢大家:)
{
while(!pThread->m_bExit)
{
if(listen(m_hSocket, SOMAXCONN) == SOCKET_ERROR)
{
continue;
} SOCKADDR addr;
int addrlen = sizeof(SOCKADDR); SOCKET hSocket = accept(m_hSocket, &addr, &addrlen);
if(hSocket == INVALID_SOCKET)
{
continue;
}
m_lSocket.AddTail(hSocket); Sleep(100);
}
}这个线程运行是会在listen处阻塞,所以在进程退出时把bExit置为true线程也不会退出,我现在采用的方法是先用closesocket(m_hSocket)关闭Socket,这样listen就会立刻返回,但不知道这样会不会有问题。
另外,好象对这种线程有一种使用信号(Event)来控制的方法,听说是最安全的,那位大侠有这方面的经验,给小弟讲讲吧,最好有个例子,谢谢大家:)
解决方案 »
- 新手求教
- 一个棘手的问题console
- 一个简单的 除0 exception 为什么catch不到??? 帮我看这段代码
- 有关“Asynchronous Pluggable Protocols“的一个难题
- 我用ADO+SQL做数据库,循环向数据库里面插入数据?
- 编译以前手删了vc,重装后每次编译都出错,弹出窗口“link.exe-无法找到组件”怎么回事啊??
- 进程控制...已知一个外部进程句柄,如何得知它已结束
- 高手请时,这是什么错误?
- jpg图象(bmp也行)如何存入数据库? 急!!!
- 怎么做安装程序?
- 建了个MULTI edit box,写入东西后,怎么写入的部分都被自动选上了,就象被鼠标选上一样。
- 请问:RegQueryValueEx 函数的问题
pThread->m_bExit来说event不是出现同步问题,而你的pThread->m_bExit是个共享变量,某种程度上还是有同步问题的.至于能否使listen()象send(),recv()从阻塞变成非阻塞型,我一点头绪都没有.
if(listen(m_hSocket, SOMAXCONN) == SOCKET_ERROR)
{
return error;
}while(!pThread->m_bExit)
{
SOCKADDR addr;
int addrlen = sizeof(SOCKADDR); SOCKET hSocket = accept(m_hSocket, &addr, &addrlen);
if(hSocket == INVALID_SOCKET)
{
continue;
}
m_lSocket.AddTail(hSocket); Sleep(100);
}如果推出的,那只有破坏其阻塞条件了。
可否举个例子,还有“使用event之所以"安全",是因为相对于你的pThread->m_bExit来说event不是出现同步问题”,为什么使用event不会出现同步问题,event我没有实际使用过,可否消息讲讲,谢谢。
listen不为阻塞,应该把accept发在循环里和listen分开。
至于event,这个是内核对象,存在就是为了解决线程同步的某些问题的。