使用继承自CAsyncSocket的类做的通讯DLL控件,只要Create一个Socket就会提示"Debug Assertion Failed"的错误???

sundy26 2004-08-03 09:08:03
我知道CAsyncSocket是MFC进行了封装,添加了一个隐形的窗口类,但是我也看到有的程序直接用MFC封装的CSocket类也可以做成DLL形式呀?

这有什么不同吗?

PS:在EXE程序测试一起正常。
...全文
277 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonjp 2004-09-06
  • 打赏
  • 举报
回复
其实,你用CSocket就可以了,你GetLastError看看,就是关于阻塞的错误
sundy26 2004-08-04
  • 打赏
  • 举报
回复
没有办法,只好使用原始套接字从新写了一个。

结帖
sundy26 2004-08-03
  • 打赏
  • 举报
回复
我随便新建一个MFC DLL的工程,并且选择添加Socket的支持。

新建一个类CMySocket继承自CAsyncSocket,

然后在CSocketClientApp类头文件

CMySocket m_mySocket;

同样在函数中:

void CSocketClientApp::InitSocketConnect(char * strIP, int connectPort)
{
m_mySocket.Create();//只要调用了这一句就会出错。
}

特别强调:
1、在Exe程序中都不会有问题。
2、也能正常连接和收发数据,但退出的时候或者再次连接的时候会出现"Debug Assertion Failed"的错误.

出步判断应该是CAsyncSocket类做成DLL,或者Socket通讯在DLL有什么特别的吗?
sundy26 2004-08-03
  • 打赏
  • 举报
回复
不是ATL的,就是一个基于MFC 的DLL

/*************** DLL和Socket初始化 *********************/

BEGIN_MESSAGE_MAP(CSocketClientApp, CWinApp)
END_MESSAGE_MAP()


// CSocketClientApp 构造

CSocketClientApp::CSocketClientApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CSocketClientApp 对象

CSocketClientApp theApp;


// CSocketClientApp 初始化

BOOL CSocketClientApp::InitInstance()
{
CWinApp::InitInstance();

if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

return TRUE;
}

/********************************************
函数名称:接口函数,Connect
功能:初始化端口侦听
参数:listenPort:侦听端口
是否连接回调函数定义:
typedef void (*CDATACALLBACK)(PackHead *ph, char *buf) ; //回调函数定义
参数:lpCallBack:回调函数
数据接收回调函数定义:
typedef void (*CISCONNECT)(PackHead *ph, char *buf) ; //回调函数定义
参数:lpDataCallBack:

返回:0:OK,else error
*********************************************/
extern "C" _declspec(dllexport) void Connect(char *strIP,int connectPort)
{
//AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
theApp.InitSocketConnect(strIP,connectPort);
}


void CSocketClientApp::InitSocketConnect(char * strIP, int connectPort)
{
myclient.Close();
int IsConnect = -1;

IsConnect = myclient.InitClientRequest(strIP,connectPort);

if(IsConnect==0)
{
myclient.Bind(3,&myctrl);
myctrl.SetComm(&myclient);
}


}
danielzhu 2004-08-03
  • 打赏
  • 举报
回复
你的DLL是不是ATL的?讲清楚一点,然后,你怎么初始化的?
sundy26 2004-08-03
  • 打赏
  • 举报
回复
有没有人告诉我使用CAsyncSocket能不能做成DLL形式??
sundy26 2004-08-03
  • 打赏
  • 举报
回复
>>>对了,初始化工作应该在应用此DLL的主程序中初始化,而不要将初始代码添加在DLL的InitInstance中。

那为什么创建DLL工程的时候,可以添加Socket支持??

现在问题在于调试到Create发现并不会出错,只有退出程序时才报错,但我将Create Socket这一段代码屏蔽就没有问题。

我的工程是VC7.01的应该不存在打补丁的问题。

sundy26 2004-08-03
  • 打赏
  • 举报
回复
我连接后直接退出程序会出现上面的错误,但如果我在退出程序之前
先调用Close函数关闭Socket就不会有这个错误?

Why?
gracezhu 2004-08-03
  • 打赏
  • 举报
回复
初始化SOCKET库,在调用Create失败后,调用GetLastError获取返回值
DentistryDoctor 2004-08-03
  • 打赏
  • 举报
回复
对了,初始化工作应该在应用此DLL的主程序中初始化,而不要将初始代码添加在DLL的InitInstance中。
DentistryDoctor 2004-08-03
  • 打赏
  • 举报
回复
既然CAsyncSocket没问题,那问题可能出现你的类上面了,至于CAsyncSocket与CSocket有什么区别,VC++带得有MFC的源代码,自己读读吧。
sundy26 2004-08-03
  • 打赏
  • 举报
回复
添加了 AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

问题还是一样
sundy26 2004-08-03
  • 打赏
  • 举报
回复
有初始化的:
BOOL CSocketSeverDLLApp::InitInstance()
{
CWinApp::InitInstance();

if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

return TRUE;
}

程序里面没有用到多线程。
gracezhu 2004-08-03
  • 打赏
  • 举报
回复
CAsyncSocket在线程中会报这个异常,参考KB
PRB: Assertion Failed on Line 837 - Sockcore.cpp

Q140527
FIX: Unhandled Exception Using MFC Sockets in Visual C++ 6.0

Q193101
另外,在MFC DLL下需要添加AFX_MANAGE_STATE(AfxGetStaticModuleState( ))宏
whale 2004-08-03
  • 打赏
  • 举报
回复
在DllMain中调用AfxSocketInit初始化Windows Sockets.

18,356

社区成员

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

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