使用WINSOCK编程时,遇到跨线程问题~

rendsc 2007-12-21 09:47:44
在学习IO重叠模式的完成程例时,我做过应答式的服务器,当服务器接收到数据时,对数据进行分析,然后向客户进行应答。
大致过程如下:
main()
{ ...
//启动接收线程
_beginthread( AcceptThread() );
...
}
//接收线程
void AcceptThread()
{
...
//接收客户套接字
SOCKET s = accept(...);
//填充OVERLAPPED结构,调用Recv函数,获取客户发送的数据
WSARecv( s,..., RecvComFun );
}
//接收的完成程例
void RecvComFun(...)
{
...
//分析接收到数据,调用WSASnd
WSASend( ..., SendComFun );
}
//发送的完成程例
void SendComFun(...)
{
//...
}
使用以上编程形式时,服务器工作的很好,完成程例RecvComFun和SendComFun都能被激活,因为WSARecv和WSASend都处于AcceptThread线程。
但是我当编写一个WIN32的服务器,该服务器可以主动向每个客户发送数据,我是在主线程中调用 WSASend(s) 函数向客户发送数据,所处的线程与调用accept函数时所处的线程并不是同一个线程。即使WSASend调用成功,完成程例SendComFun也不会被激活。请问这是因为调用accept的线程与调用WSASend函数的线程,不在同一个线程导致的吗?有什么办法可以解决?

我也有试过服务器负责监听的套接字采用事件选择模式(EventSelect),当FD_ACCEPT发生时,在主线程中调用accept接收客户的连接,然后在主线程中调用WSARecv和WSASend函数了,但是,发现WSARecv和WSASend的完成程例都无法被激活,难道重叠IO模式与EventSelect不能共存?
...全文
115 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

18,356

社区成员

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

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