求助,在线程中创建SOCKET遇到的报错问题。

chxy85 2010-10-27 04:58:17
代码很简单
BOOL Ctest_CAsyncSocketDlg::OnInitDialog()
{
//..........................

// TODO: 在此添加额外的初始化代码
::CreateThread(0,0,(LPTHREAD_START_ROUTINE)myfun,this,0,0);

return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void myfun(Ctest_CAsyncSocketDlg *dlg)
{
AfxSocketInit();
CAsyncSocket sock;
sock.Create();
}


如上,程序运行到sock.Create();会严重报错,不知道为什么,求高手解答.....
...全文
266 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
VC_ZSY 2010-10-30
  • 打赏
  • 举报
回复
如果你在线程中不调用AfxSocketInit则报错,如果你调用了则更加容易报错
===
意思主线程调用AfxSocketInit,子线程不需要调用AfxSocketInit了,如果调用了也行,但是你子线程释放网络环境后主线程及主线程的其他子线程则不可以使用这个网络环境了,需要重新调用AfxSocketInit来初始化。所以子线程调用了更加容易出错。
其实说白了就是在InitInstance调用AfxSocketInit
如果应用程序要加载DLL,而DLL中也要使用网络,则需要在DLL初始化函数中调用AfxSocketInit,否则DLL中不可访问网络,因为加载的DLL并不是当前程序的子线程。
james_cheng10 2010-10-29
  • 打赏
  • 举报
回复
AfxSocketInit();
一般放到App类的InitInstance函数中,而且记忆中好像是只能加载1.1版本的,而CAsyncSocket是在2.2版本的吧,还有我感觉你的线程函数格式有错哦。
chxy85 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vc_zsy 的回复:]
是因为线程里面和主程序线程没有关系的缘故吗?
=========
差不多
每一个线程有一个单独的网络环境,如果你在线程中不调用AfxSocketInit则报错,如果你调用了则更加容易报错,最好的方法是在应用程序的主线程中调用AfxSocketInit。但是如果加载了DLL的话,如果DLL也要网络通信,则在DLL里面也要调用AfxSocketInit来初始化DLL线程的网络环境
个人见解,仅……
[/Quote]

嗯,看来是这样,不过对“如果你在线程中不调用AfxSocketInit则报错,如果你调用了则更加容易报错”这句话有些疑问?
chxy85 2010-10-28
  • 打赏
  • 举报
回复
这么说,如果你希望在线程中,调用主线程已经写到的一个SOCKET,那么只能采用POSTMESSAGE的方式了吗?
目前我是这么做的
VC_ZSY 2010-10-28
  • 打赏
  • 举报
回复
谁给你说主线程是OnInitDialog了??
放到InitInstance里面就没问题了~~
原因见4楼~~~
白虹李李 2010-10-28
  • 打赏
  • 举报
回复
我一般是作为参数传递到线程里去的,楼上的都说得对。你初始化别放在自己的函数里啊。而且如果是MFC的程序,很可能自己都初始化过了的。
VC_ZSY 2010-10-28
  • 打赏
  • 举报
回复
麻烦LZ你好好看看4楼我给你的解释好吗??
只是一个应用程序线程有一个网络环境(只需初始化一次),而不是只能定义一个SOCKET
stjay 2010-10-27
  • 打赏
  • 举报
回复
试试改用AfxBeginThread
MFC的类很多是线程相关的
chxy85 2010-10-27
  • 打赏
  • 举报
回复
没那么简单,如果我直接将
CAsyncSocket sock;
sock.Create();
放在OnInitDialog()里面,即使没有
AfxSocketInit();
程序也不会报错....

唉,线程实在是个神秘的东西啊
Eleven 2010-10-27
  • 打赏
  • 举报
回复
AfxSocketInit();
一般放到App类的InitInstance函数中
chxy85 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ouyh12345 的回复:]


要学会用WSAGetLastError获得并分析错误
[/Quote]

是报错不是失败,没法使用WSAGetLastError
ouyh12345 2010-10-27
  • 打赏
  • 举报
回复


要学会用WSAGetLastError获得并分析错误
VC_ZSY 2010-10-27
  • 打赏
  • 举报
回复
是因为线程里面和主程序线程没有关系的缘故吗?
=========
差不多
每一个线程有一个单独的网络环境,如果你在线程中不调用AfxSocketInit则报错,如果你调用了则更加容易报错,最好的方法是在应用程序的主线程中调用AfxSocketInit。但是如果加载了DLL的话,如果DLL也要网络通信,则在DLL里面也要调用AfxSocketInit来初始化DLL线程的网络环境
个人见解,仅供参考
chxy85 2010-10-27
  • 打赏
  • 举报
回复
纠正一下,是这样的

上面那样是不会报错的,但是如果我将AfxSocketInit();放到OnInitDialog()里面就会出错了////

求解,是因为线程里面和主程序线程没有关系的缘故吗?
zyyoung 2010-10-27
  • 打赏
  • 举报
回复
下断点,看下崩溃在哪里
快乐鹦鹉 2010-10-27
  • 打赏
  • 举报
回复
具体报什么错,描述一下。用Try catch捕捉一下错误

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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