我想要实现的是:同一个socket,两个recv函数,其中一个在while(true)下,时刻准备接收,另一个在特定情况下用.当我打算用第二个recv的时候,暂停第一个recv函数.
现在这样:
在第一个recv处,将socket设置成非阻塞: C/C++ code
while(true)
{
unsigned long ul=1;
ioctlsocket(sock,FIONBIO,&ul);
int retval=recv(sock,RecvBuff,2000,0);
......
}在第二个recv处,将socket设置成阻塞: C/C++ code
SuspendThread(m_hThread);
unsigned long ul=0;
ioctlsocket(m_SockClient,FIONBIO,&ul);
char RecvBuff[2000];
memset(RecvBuff,0,2000);
int retval=recv(m_SockClient,RecvBuff,2000,0);
ResumeThread(m_hThread);
......其中第一个recv在线程m_hThread中,所以要用到时先用SuspendThread把它挂起.这样大部分情况下相安无事,可是少数时候程序会死掉,经调试发现程序是停在第二个recv的ioctlsocket(m_SockClient,FIONBIO,&ul);这条语句上.
想想原因,估计是当分线程挂起时正停在ioctlsocket(sock,FIONBIO,&ul);中,所以当又一次调用时,出现了这样的差错,不知道是否是这样呢?这种情况该如何解决? (两个socket名字不一样,但其实是同一个)
现在这样:
在第一个recv处,将socket设置成非阻塞: C/C++ code
while(true)
{
unsigned long ul=1;
ioctlsocket(sock,FIONBIO,&ul);
int retval=recv(sock,RecvBuff,2000,0);
......
}在第二个recv处,将socket设置成阻塞: C/C++ code
SuspendThread(m_hThread);
unsigned long ul=0;
ioctlsocket(m_SockClient,FIONBIO,&ul);
char RecvBuff[2000];
memset(RecvBuff,0,2000);
int retval=recv(m_SockClient,RecvBuff,2000,0);
ResumeThread(m_hThread);
......其中第一个recv在线程m_hThread中,所以要用到时先用SuspendThread把它挂起.这样大部分情况下相安无事,可是少数时候程序会死掉,经调试发现程序是停在第二个recv的ioctlsocket(m_SockClient,FIONBIO,&ul);这条语句上.
想想原因,估计是当分线程挂起时正停在ioctlsocket(sock,FIONBIO,&ul);中,所以当又一次调用时,出现了这样的差错,不知道是否是这样呢?这种情况该如何解决? (两个socket名字不一样,但其实是同一个)
解决方案 »
- GetMoudleHandle函数的一点疑惑
- SOCKET网络编程 怎样将接受到的char型变为unsigned char型数据
- 为什么在无VC的电脑上运行不了程序(Release 版本和debug版本都试过)
- CImage类如何实现图片的旋转
- 屏幕的显示属性中选择 大/小 字体 显示, 怎么在程序中判断当前系统是采用哪种字体尼?
- 我用ADO绑定更新记录失败,请高手指教
- 急死人了!!鼠标点击listbox和listctrl时如何得到当前选择项的值?
- 简单的工具条问题,大家来抢分
- 奇怪啊!!一个关于PORT的问题?
- ATL的CAxHostWindow的一个问题,自己搞了很久也想不通◎◎◎◎◎
- 网络编程,多线程常见问题求解!!
- 关于多线程,程序高手帮忙解答低级问题啊!
用overlapped方式,然后wait那个overlapped句柄和一个自定义eventint retval=recv(sock,RecvBuff,2000,&ol);
WaitForMultiObject(...);第二个recv准备开始的时候设置这个事件,第一个recv线程的wait就会结束,然后在第一个线程CancelIO------------------------------
C++网络服务器开发群(QQ)招新,不欢迎c++入门级新手,群号41356711
群上限200,目前群内170+人,加群请注明自己目前情况
主要讨论方向:网络和多线程服务器开发、IOCP等
2 ioctlsocket(sock,FIONBIO,&ul); 在循环外面设置一次就够了
while(true)
{
criticalSection.Lock()
unsigned long ul=1;
ioctlsocket(sock,FIONBIO,&ul);
int retval=recv(sock,RecvBuff,2000,0);
......
criticalSection.Unlock();
}
在第二个recv处,将socket设置成阻塞: C/C++ code
criticalSection.Lock();
unsigned long ul=0;
ioctlsocket(m_SockClient,FIONBIO,&ul);
char RecvBuff[2000];
memset(RecvBuff,0,2000);
int retval=recv(m_SockClient,RecvBuff,2000,0);
ResumeThread(m_hThread);
......
criticalSecion.Unlock();注意:CCriticalSection criticalSection为全局变量。