请教:Socket编程的问题

testpwd 2010-06-10 03:22:25
一个对话框界面的简单服务器程序,界面上有个“启动服务器”的按钮,其事件代码如下:

void CServerTestDlg::OnStart()
{
g_srvSocket.Create(6000);
if(g_srvSocket.Listen())
{
AfxMessageBox("服务器启动成功,开始监听客户请求!");
}
else
{
AfxMessageBox("服务器启动失败!");
return;
}
AfxBeginThread(ServerThreadFunc, 0);
}

g_srvSocket 是全局变量,ServerThreadFunc是全局函数,用于在新线程中处理到来的连接。

CSocket g_srvSocket;

UINT ServerThreadFunc(LPVOID pParam)
{
CSocket workSocket;
if(!g_srvSocket.Accept(workSocket))
{
AfxMessageBox("Accept出错");
return 1;
}
AfxBeginThread(ServerThreadFunc, pParam);//启动新线程监听

.....
}

但是执行到if(!g_srvSocket.Accept(workSocket))这句就出错了。

调试跟进去,发现是CSocket里面调用了一个PumpMessages函数,而PumpMessages中有句话

ASSERT(pState->m_hSocketWindow != NULL);

这个断言为假。

请问各位这是怎么回事呢?正确的应该如何写呢?
...全文
155 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zkj66278006 2010-06-12
  • 打赏
  • 举报
回复
初学者 不要用 MFC的SOCOKET 自己用 API写吧
delphiwcdj 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shenyi0106 的回复:]

windows网络编程
看书只是一部分,很多问题书上是不会提及的,这需要不断的去编码,发现问题,解决问题,然后你就会不断的提高
[/Quote]
说得很对
Huqing008 2010-06-11
  • 打赏
  • 举报
回复
g_srvSocket.Accept(workSocket)
不能在新线程中使用;
新连接线程的创建过程应该是监听到新连接select(); 然后再g_srvSocket.Accept(workSocket) ;创建线程,参数为g_srvSocket和端口号的指针;
shenyi0106 2010-06-10
  • 打赏
  • 举报
回复
windows网络编程
看书只是一部分,很多问题书上是不会提及的,这需要不断的去编码,发现问题,解决问题,然后你就会不断的提高
uuhua9 2010-06-10
  • 打赏
  • 举报
回复
同问啊。。谢谢~[Quote=引用 9 楼 testpwd 的回复:]
引用 8 楼 shenyi0106 的回复:
引用 7 楼 testpwd 的回复:
看一些书上用CAsyncSocket类,感觉挺简单,实际上还是很复杂的,书上很多都没讲到,像上面那个兄弟说的在不同线程中使用的问题。

其实了解原理了,用CAsyncSocket还是比较简单的


不知大侠能否推荐一本对winsock讲的比较清楚、详细的书?

我看了几本书,觉得写的都很泛泛、或……
[/Quote]
testpwd 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shenyi0106 的回复:]
引用 7 楼 testpwd 的回复:
看一些书上用CAsyncSocket类,感觉挺简单,实际上还是很复杂的,书上很多都没讲到,像上面那个兄弟说的在不同线程中使用的问题。

其实了解原理了,用CAsyncSocket还是比较简单的
[/Quote]

不知大侠能否推荐一本对winsock讲的比较清楚、详细的书?

我看了几本书,觉得写的都很泛泛、或者比较混乱。
shenyi0106 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 testpwd 的回复:]
看一些书上用CAsyncSocket类,感觉挺简单,实际上还是很复杂的,书上很多都没讲到,像上面那个兄弟说的在不同线程中使用的问题。
[/Quote]
其实了解原理了,用CAsyncSocket还是比较简单的
testpwd 2010-06-10
  • 打赏
  • 举报
回复
看一些书上用CAsyncSocket类,感觉挺简单,实际上还是很复杂的,书上很多都没讲到,像上面那个兄弟说的在不同线程中使用的问题。
mayudong1 2010-06-10
  • 打赏
  • 举报
回复
好像一做socket,大家都推荐用api函数,没几个推荐用MFC类的
testpwd 2010-06-10
  • 打赏
  • 举报
回复
如果不用CAsyncSocket类,直接用winsock api,比如socket、bind、listen、accept等这些函数

是不是就不存在这个问题呢?
shenyi0106 2010-06-10
  • 打赏
  • 举报
回复
不管是否是全局变量
CAsyncSocket都具有线程相关特性,也就是说你在那个线程里创建了它,那么就只能在这个线程里使用它,到别的线程里使用的话,它是不允许的;当然也由例外,如果你非要在别的线程里使用,那么提供给你一个Detach函数,将SOCKET句柄和当前线程脱离关系,在到新线程里用Attach添加关系,就可以了。
testpwd 2010-06-10
  • 打赏
  • 举报
回复
To shenyi0106:

你的意思是说全局变量g_srvSocket由于是在界面线程中创建的,所以不能在ServerThreadFunc所在的

新线程中使用?
shenyi0106 2010-06-10
  • 打赏
  • 举报
回复
CAsyncSocket具有线程相关特性
它必须在创建它的线程中使用,
如果你要到其他线程中使用的话,请使用Detach和Attach函数
具体向参看MSDN
testpwd 2010-06-10
  • 打赏
  • 举报
回复
自己顶一个

18,356

社区成员

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

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