为何调用CSocket的Create会出错?

ccwing 2002-09-12 05:30:50
AfxSocketInit()也调用了,在Debug版本中正常运行,但一改为Release版本立刻出错。

我用CreateThread创建一个线程,然后再在此线程中CSocket的Create,在Release版本中出错,代码如下:
if(m_Socket.m_hSocket != NULL)
m_Socket.Close();
m_Socket.Create();

后来发现是多线程的问题,如果不是在新建的线程中调用CSocket的Create,而是在主线程,在Release版本也没错。

为什么Debug正常的在Release就出错,如何解决这个问题?
...全文
635 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bind 2002-09-20
  • 打赏
  • 举报
回复
不用释放。
ccwing 2002-09-20
  • 打赏
  • 举报
回复
to sjzxyg(小小鸟) :
那么,不用释放吗?
Bind 2002-09-20
  • 打赏
  • 举报
回复
呵呵,来晚了。

偶以为这个问题在CSDN只有我一个人知道呢。高手还是多啊
sjzxyg 2002-09-20
  • 打赏
  • 举报
回复
在非主线程中只初始化一次就行了
sjzxyg 2002-09-20
  • 打赏
  • 举报
回复
是的,要建立连表来管理socket
quengzi 2002-09-20
  • 打赏
  • 举报
回复
xue
ccwing 2002-09-20
  • 打赏
  • 举报
回复
to ancienttale(voidman) :
万分多谢ancienttale(voidman) !!!另外一个帖子的分已经奉上,此贴的分也不久就要奉上。
我有一个问题还要请教一下你,这样调用SocketThreadInit,是不是为每个线程都分配一个全局数组之类的来管理CSocket对象与socket句柄?需不需要在线程结束时做些工作来释放这个资源?如何释放?这样如果有很多个线程都调用SocketThreadInit会影响效率吗?
firmamenthy 2002-09-20
  • 打赏
  • 举报
回复
mark
ancienttale 2002-09-20
  • 打赏
  • 举报
回复
http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q193101&

FIX: Unhandled Exception Using MFC Sockets in Visual C++ 6.0
The information in this article applies to:
The Microsoft Foundation Classes (MFC), when used with:
Microsoft Visual C++, 32-bit Enterprise Edition 6.0
Microsoft Visual C++, 32-bit Professional Edition 6.0
Microsoft Visual C++, 32-bit Learning Edition 6.0
Symptoms
When using MFC sockets in secondary threads in a statically linked MFC Visual C++ 6.0 application, an unhandled exception occurs.
Cause
The reason for the unhandled exception is that an object of type CMapPtrToPtr pointer, pointed to by m_pmapSocketHandle, is never created.
Resolution
The handle maps used by the sockets need to be created for each thread. The following code shows a function to do this:
void SocketThreadInit()
{
#ifndef _AFXDLL
#define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
#define _afxSockThreadState AfxGetModuleThreadState()

_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (pState->m_pmapSocketHandle == NULL)
pState->m_pmapSocketHandle = new CMapPtrToPtr;
if (pState->m_pmapDeadSockets == NULL)
pState->m_pmapDeadSockets = new CMapPtrToPtr;
if (pState->m_plistSocketNotifications == NULL)
pState->m_plistSocketNotifications = new CPtrList;

#endif
}
This function should be called once in each secondary thread before the first socket is created in the new thread.
戴晶晶jjyyis 2002-09-19
  • 打赏
  • 举报
回复
7251655,这样太慢,那时我的QQ号
戴晶晶jjyyis 2002-09-19
  • 打赏
  • 举报
回复
你的CSocket 的实例是在线程中新建的马???

CSocket是不支持多线程操作的
wenrich 2002-09-19
  • 打赏
  • 举报
回复
m_Socket.m_hSocket != NULL

有了socket, 为什么还要 Create() 呢?不明白
virtualfunction 2002-09-19
  • 打赏
  • 举报
回复
socket的close需要时间,在没有确认close之前,create肯定会出错!你设置了FD_CLOSE,应该在该事件发生后再create,debug不出错是因为debug执行速度慢和执行方式不同release,其时close动作已经完成,所以不出错。release就不同了,动作太快,还没有close完,就create....。
ccwing 2002-09-19
  • 打赏
  • 举报
回复
这个问题我已经问了两次了,就算解决不了(我已有此预感),但至少也要弄明个所以然来,到时两边一并给分。
ccwing 2002-09-19
  • 打赏
  • 举报
回复
to virtualfunction(virtualfunction) :
我那段代码是在一个循环体内,在第一次循环的时候m_Socket.Close();是不会执行的(因为还没创建,m_Socket.m_hSocket的值为INVALID_SOCKET)。而我在第一次循环时就出错。

to jingjing8178(晶晶) :
今天我就想向你请教一下怎样在多线程内使用CSocket,还望能指点一下,QQ上等。
ccwing 2002-09-18
  • 打赏
  • 举报
回复
to : jingjing8178(晶晶)

我在线程函数内加了AfxSocketInit()也还是不行,不知应该如何对每个线程进行初始化,是开线程之前还是线程函数中?
firness 2002-09-18
  • 打赏
  • 举报
回复
我也遇过类似问题,但是我用share library 没出错就算了。
ccwing 2002-09-18
  • 打赏
  • 举报
回复
to: howtotell(touch)

我注释了:
if(m_Socket.m_hSocket != NULL)
m_Socket.Close();
也不行。
后来代码改为:
if(m_Socket.m_hSocket != INVALID_SOCKET)
m_Socket.Close();
那么Close是不执行的了,但仍然出错。
戴晶晶jjyyis 2002-09-18
  • 打赏
  • 举报
回复
在新的线程中调用AfxSocketInit()来初始化

新的线程也需要初始化,否则不能Create
ccwing 2002-09-18
  • 打赏
  • 举报
回复
我是调用AfxSocketInit()来初始化的。不知AfxSocketInit()与wsainitial有何区别?好像AfxSocketInit是经过MFC封装的。总之CxxxAPP的InitInstant中调用了AfxSocketInit也还是出错,这在本文的一开始就说过了。应该与此无关。
加载更多回复(12)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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