各位救命:CAsyncSocket创建失败的问题

thd111 2003-06-18 11:03:36
if(m_pSocket)
return -1;

m_pSocket = new CAsyncSocket;
if(!m_pSocket->Create()) ------>创建失败!说是资源不足
{
delete m_pSocket;
m_pSocket = NULL;
return -1;
}

请问各位:用MS的CAsyncSocket有什么要注意的地方么
...全文
334 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
thd111 2003-08-04
  • 打赏
  • 举报
回复
解决了,其实很简单,谢谢大家的参与
thd111 2003-06-20
  • 打赏
  • 举报
回复
一些注释是乱码了,大家可以不用理会,在源码里有一段

m_pCallSocket = new CWinSocket;
if(!m_pCallSocket->Create())----------->报异常
{
delete m_pCallSocket;
m_pCallSocket = NULL;
return -1;
}
thd111 2003-06-20
  • 打赏
  • 举报
回复
下边是源码

#include "stdafx.h"
#include "deftype.h"
#include "ado.h"
#include "winsocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


LPREGISTERDOWNTERMINAL RegisterDownTerminal = NULL;
LPDELIVERRESPCALLBACK DeliverDownResp = NULL;
LPREPORTRESPCALLBACK ReportDownResp = NULL;
LPDOWNTERMINALCLOSE DownTerminalClose = NULL;
LPDOWNSERVERSTARTCALLBACK DownServerStart = NULL;

int m_nNo = 0;
BYTE m_bType = 0;
char m_szConstr[120];
CString strLocalIP="";
int m_nPort=0;

CWinSocket* m_pSocket = NULL;
CWinSocket* m_pCallSocket = NULL;

void WINAPI DOWNInit(LPREGISTERDOWNTERMINAL REGISTERDOWNTERMINAL,
LPDELIVERRESPCALLBACK DELIVERDOWNRESP,
LPREPORTRESPCALLBACK REPORTDOWNRESP,
LPDOWNTERMINALCLOSE DOWNTERMINALCLOSE,
LPDOWNSERVERSTARTCALLBACK DOWNSERVERSTARTCALLBACK
)
{
AfxSocketInit();
RegisterDownTerminal = REGISTERDOWNTERMINAL;
DeliverDownResp = DELIVERDOWNRESP;
ReportDownResp = REPORTDOWNRESP;
DownTerminalClose = DOWNTERMINALCLOSE;
DownServerStart = DOWNSERVERSTARTCALLBACK;
}

void WINAPI DOWNClose()
{
CADODatabase cDatabase;

cDatabase.Open(m_szConstr);
CADORecordset rs(&cDatabase);
rs.RefreshParam("prcCzDOWNCenter");
rs.SetParameterValue("@Czlb", (BYTE)3);
rs.SetParameterValue("@No", m_nNo);
rs.Open("prcCzDOWNCenter", CADORecordset::openStoredProc);

cDatabase.Close();

delete m_pSocket;
delete m_pCallSocket;

m_pSocket = NULL;
m_pCallSocket = NULL;
}

int WINAPI DOWNSvrOpen(int nNo, int nType, int nPort, char* szConstr)
{
CADODatabase cDatabase;

if(!cDatabase.Open(szConstr))
return -1;


m_pSocket = new CWinSocket;

if(!m_pSocket->Create(nPort))
{
delete m_pSocket;
m_pSocket = NULL;
return -1;
}

if(!m_pSocket->Listen())
{
delete m_pSocket;
m_pSocket = NULL;
return -1;
}

m_nNo = nNo;
m_bType = (BYTE)nType;
m_nPort = nPort;
strcpy(m_szConstr, szConstr);

char szComputerName[100];
DWORD nLen=100;
GetComputerName(szComputerName, &nLen);
szComputerName[nLen] = 0;

hostent* hp = gethostbyname(szComputerName);

struct in_addr ip;
memcpy(&ip, hp->h_addr, sizeof(ip));
strLocalIP = inet_ntoa(ip);

CADORecordset rs(&cDatabase);

//²éѯһ¸öÒѾ­ÔÚÔËÐеĴ¦ÀíÖÐÐÄ
rs.RefreshParam("prcCxDOWNCenter");
rs.SetParameterValue("@Cxfs", (BYTE)1);
rs.Open("prcCzDOWNCenter", CADORecordset::openStoredProc);
if(!rs.IsEOF())
{
CString IP;
int port;

rs.GetFieldValue("IP", IP);
rs.GetFieldValue("Port", port);

m_pCallSocket = new CWinSocket;
if(!m_pCallSocket->Create())
{
delete m_pCallSocket;
m_pCallSocket = NULL;
return -1;
}
m_pCallSocket->Connect(IP, port);
}


rs.RefreshParam("prcCzDOWNCenter");
rs.SetParameterValue("@Czlb", (BYTE)1);
rs.SetParameterValue("@No", nNo);
rs.SetParameterValue("@Type", (BYTE)nType);
rs.SetParameterValue("@IP", strLocalIP);
rs.SetParameterValue("@Port", nPort);
rs.Open("prcCzDOWNCenter", CADORecordset::openStoredProc);

cDatabase.Close();

return 0;
}

int WINAPI DOWNDeliver(
long lSocket,
__int64 Sequence_No, //ÓÉÏ·¢´¦Àí¶ËΪÐÅÏ¢Éú³ÉÐÅÏ¢ÔÚ±¾¶ËµÄ±àºÅ
LPCTSTR CP_User, //CP̞
__int64 Msg_Id, //Èç¹ûÊÇÀ´×ÔCMPPµÄÏ·¢ÏûÏ¢£¬ÔòΪÒƶ¯µÄMSG_ID£¬·ñÔòΪ0
char Sgip_Id[40], //Èç¹ûÊÇÀ´×ÔSGIPµÄÏ·¢ÏûÏ¢£¬ÔòΪÁªÍ¨µÄSEQUENCENO£¬·ñÔòΪ¿Õ
LPCTSTR Service_Type, //ÒµÎñ´úÂë
LPCTSTR Dest_termianl, //Ä¿µÄÖն˺ÅÂë
BYTE TP_pid, //GSMЭÒéÀàÐÍ
BYTE TP_udhi,//GSMЭÒéÀàÐÍ
BYTE Msg_Fmt, //ÐÅÏ¢¸ñʽ
LPCTSTR Src_terminal,//Ô´ºÅÂë
BYTE Msg_Length, //ÄÚÈݳ¤¶È
LPCTSTR Msg_Content //ÐÅÏ¢ÄÚÈÝ
)
{
return m_pSocket->Deliver(lSocket, Sequence_No, CP_User, Msg_Id, Sgip_Id, Service_Type,
Dest_termianl, TP_pid, TP_udhi, Msg_Fmt, Src_terminal, Msg_Length, Msg_Content);
}

int WINAPI DOWNReport(
long lSocket,
__int64 Sequence_No, //»Ø±¨µÄ¶ÌÏûÏ¢ÐÅÏ¢Âë
LPCTSTR Stat, //·¢ËͶÌÏûÏ¢µÄÓ¦´ð½á¹û
LPCTSTR Submit_time, //Ìύʱ¼ä YYMMDDHHMM
LPCTSTR Done_time, //´¦Àíʱ¼ä YYMMDDHHMM
LPCTSTR Dest_terminal_Id //Ä¿µÄÖÕ¶ËMSISDNºÅÂë(SP·¢ËÍCMPP_SUBMITÏûÏ¢µÄÄ¿±êÖÕ¶Ë)
)
{
return m_pSocket->Report(lSocket, Sequence_No, Stat, Submit_time, Done_time, Dest_terminal_Id);
}

void FillCharBuffer(char* szDest, const char* szSource, int nLen)
{
int len = (int)strlen(szSource)>nLen?nLen:strlen(szSource);

memcpy(szDest, szSource, nLen);
}
Healer 2003-06-20
  • 打赏
  • 举报
回复
同意, 多给代码吧, 这上哪里找错啊?
alanwang_ 2003-06-20
  • 打赏
  • 举报
回复
是第一次就失败还是执行多次之后才失败?
试着把数据库访问什么的都去掉,只留下socket部分,看看还有没有错!
注意m_pCallSocket的delete
CWinSocket类重要部分的代码!
不录 2003-06-20
  • 打赏
  • 举报
回复
CWinSocket是不是你自己派生的类,贴出来瞧瞧。
Richuen22 2003-06-19
  • 打赏
  • 举报
回复
你继承它的子类就不要
m_pSocket = new CAsyncSocket;
应为 //如CMyAsync为继承CAsyncSocket的
CMyAsync m_pSocket; //在XXX.h中

m_pSocket = new CMyAsync;
shilong 2003-06-19
  • 打赏
  • 举报
回复
建议加上:AfxSocketInit();
如果不行在Create后面加上这些代码查错


LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
TRACE(lpMsgBuf );
ftp127 2003-06-19
  • 打赏
  • 举报
回复
用Getlasterror()得到错误,到MSDN里去查一下。
ftp127 2003-06-19
  • 打赏
  • 举报
回复
if(!m_pSocket->Create()) ------>创建失败!说是资源不足
{
delete m_pSocket;
m_pSocket = NULL;
return -1;
}

若改成下面呢?
if(!m_pSocket->Create()) ------>创建失败!说是资源不足
{
m_pSocket = NULL;
delete m_pSocket;
return -1;
}
不录 2003-06-19
  • 打赏
  • 举报
回复
你说wincore.cpp有异常,那就偏你的问题太远了,除非把源代码给大家,不然大家在这儿只是在大海捞针的找问题。
Healer 2003-06-19
  • 打赏
  • 举报
回复
晕, 我中文和英文互译的本事不好, 你说资源不足?? 什么意思啊?? 我好像没有见过这个问题,

关于m_pSocket在哪里定义的啊, 都列出来吧??
thd111 2003-06-19
  • 打赏
  • 举报
回复
各位:我现在是这样定义的

CWinSocket 由 CAsyncSocket继承

if(m_pSocket)
return -1;

m_pSocket = new CWinSocket;
if(!m_pSocket->Create()) ------>创建失败!说是资源不足
{
delete m_pSocket;
m_pSocket = NULL;
return -1;
}
Healer 2003-06-19
  • 打赏
  • 举报
回复
单纯看你的代码是没有错误的了,

还有建议你, 用异步Socket类, 一定要继承一次了,

还有, 那个CAnsyncSocket是不是含有纯虚函数啊?? (大汗)
[估计是了, 这叫什么啊, 抽象类不能建立对象, 但是可以构造对象的指针了.]
thd111 2003-06-19
  • 打赏
  • 举报
回复
为什么会出现取实例句柄失败呢???
thd111 2003-06-19
  • 打赏
  • 举报
回复
我也已经调用AfxSocketInit();
thd111 2003-06-19
  • 打赏
  • 举报
回复
我现在跟到原码里,发现
HINSTANCE hInst=AfxGetInstanceHandle();包异常

原因:Debug Assertion Failed!

文件:wincore.cpp

各位侃侃是什么回事
不录 2003-06-19
  • 打赏
  • 举报
回复
应该是你没有AfxSocketInit();

可以看一下CAsyncSocket::Create的源代码
BOOL CAsyncSocket::Create(UINT nSocketPort, int nSocketType,
long lEvent, LPCTSTR lpszSocketAddress)
{
if (Socket(nSocketType, lEvent))
{
if (Bind(nSocketPort,lpszSocketAddress))
return TRUE;
int nResult = GetLastError();
Close();
WSASetLastError(nResult);
}
return FALSE;
}

其实Bind至少是要先WSAStartup才行的。另外别忘记查看WSAGetLastError()
thd111 2003-06-18
  • 打赏
  • 举报
回复
我这是做了一个DLL,调用的时候就出现这个问题,晕
thd111 2003-06-18
  • 打赏
  • 举报
回复
对了,是不是对外部变量的定义有什么要求?
加载更多回复(4)

18,355

社区成员

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

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