CSocket的Accept是阻塞的吗???

GoForSky 2009-12-08 12:03:24
1:建立一个基于对话框的程序
2:添加如下便利
class CServeDlg : public CDialog
{
// Construction
..............................
public:
CSocket m_sockSend;
CSocket sockListen;
}

3:OnInitDialog()添加如下代码
BOOL CServeDlg::OnInitDialog()
{
............................
sockListen.Create(5802,SOCK_STREAM,"127.0.0.1");
sockListen.Bind(5801,"127.0.0.1");
sockListen.Listen(5);

sockListen.Accept(m_sockSend);//m_sockSend用于存放客户端的信息
sockListen.Close(); //不再监听

SetTimer(1,2000,NULL);
return TRUE; // return TRUE unless you set the focus to a control
}

4:
void CServeDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
CString str;
str.Format("%d",iIndex++);
AfxMessageBox(str,MB_OK);
}

运行结果:
是2秒为界限,不同的弹出对话框显示1,2,3
我的疑问:
CSocket的Accept函数为阻塞的,就是说客户端没有连接时,服务器端应该一直停在
sockListen.Accept[/b](m_sockSend);//m_sockSend用于存放客户端的信息
这一行;后面的SetTimer不应该被执行
可是运行结果显示:OnTimer在执行(客户端还没连接时)
为什么????奇怪
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yschenwei 2009-12-08
  • 打赏
  • 举报
回复
如果Accept或是上面的其他操作比如listen出现异常的话就不会阻塞了。
GoForSky 2009-12-08
  • 打赏
  • 举报
回复

都说的是什么,不理解
mengde007 2009-12-08
  • 打赏
  • 举报
回复
不是;它内部已经开了一个线程;
wangxipu 2009-12-08
  • 打赏
  • 举报
回复
监听过程一般都是需要阻塞呃
nintendo_dskay 2009-12-08
  • 打赏
  • 举报
回复
一般来说Accept需要一个循环来不断判断是否有连接接入的。
nintendo_dskay 2009-12-08
  • 打赏
  • 举报
回复
参考
http://www.vckbase.com/document/viewdoc/?id=1375

18,355

社区成员

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

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