CAsyncSocket编程一个十分郁闷的问题,执行Connect函数报告异常

zhaowenbin 2008-05-27 01:47:05
程序代码如下:
BOOL bFlag;
m_master_connect_socket.ShutDown(2);
m_master_connect_socket.m_hSocket=INVALID_SOCKET;

bFlag=m_master_connect_socket.Create(0,SOCK_STREAM,FD_CONNECT,NULL);
if (!bFlag)
{
AfxMessageBox("Create Socket Error!");
m_master_connect_socket.Close();
PostQuitMessage(0);
}
else
{
char svraddr[256];
UINT svrport;
svrport=LISTENPORT;
memcpy(svraddr,"192.168.89.129",sizeof(svraddr));
m_master_connect_socket.AsyncSelect(FD_CONNECT);
bFlag=m_master_connect_socket.Connect(svraddr,svrport);//此处报错

if(!bFlag)
{
AfxMessageBox("Connect Socket Error!");
m_master_connect_socket.Close();
PostQuitMessage(0);
}
}
程序运行到connect函数是报告错误,错误内容如下:
Unhandled Exception in xxx.exe(MFCN42D.DLL):0xC0000005:Access Violation
这是怎么回事?如何解决,请教高手们。谢谢,在线等
...全文
355 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
googlg 2011-07-06
  • 打赏
  • 举报
回复
m_socket.connect 成功后返回0
HuWenjin 2008-05-30
  • 打赏
  • 举报
回复
m_master_connect_socket.ShutDown(2);
m_master_connect_socket.m_hSocket=INVALID_SOCKET;

改成
m_master_connect_socket.Close();

试一下
cwc270 2008-05-29
  • 打赏
  • 举报
回复

memcpy(svraddr,"192.168.89.129",sizeof(svraddr)); //改成strcpy试试

bFlag=kk.Connect(svraddr,svrport);
if(!bFlag)//判断不对,如果Connect成功是返回0的
{
....
}

cppwin 2008-05-29
  • 打赏
  • 举报
回复
删掉 m_master_connect_socket.m_hSocket=INVALID_SOCKET;
cppwin 2008-05-29
  • 打赏
  • 举报
回复
ShutDown之后,需要Close
zhaowenbin 2008-05-29
  • 打赏
  • 举报
回复
如果问题不能够解决,看来只有不使用MFC了,直接采用Winsock编程。
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
继承的CPP文件如下:
// MasterConnectSocket.cpp : implementation file
//

#include "stdafx.h"
#include "winvnc.h"
#include "MasterConnectSocket.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMasterConnectSocket

CMasterConnectSocket::CMasterConnectSocket()
{
}

CMasterConnectSocket::~CMasterConnectSocket()
{
Close();
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CMasterConnectSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CMasterConnectSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0

/////////////////////////////////////////////////////////////////////////////
// CMasterConnectSocket member functions

void CMasterConnectSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CAsyncSocket::OnConnect(nErrorCode);
}
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
继承的头文件如下:
#if !defined(AFX_MASTERCONNECTSOCKET_H__573A6893_E6D3_483A_BEDF_19030B59C05B__INCLUDED_)
#define AFX_MASTERCONNECTSOCKET_H__573A6893_E6D3_483A_BEDF_19030B59C05B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MasterConnectSocket.h : header file
//



/////////////////////////////////////////////////////////////////////////////
// CMasterConnectSocket command target

class CMasterConnectSocket : public CAsyncSocket
{
// Attributes
public:

// Operations
public:
CMasterConnectSocket();
virtual ~CMasterConnectSocket();

// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMasterConnectSocket)
public:
virtual void OnConnect(int nErrorCode);
//}}AFX_VIRTUAL

// Generated message map functions
//{{AFX_MSG(CMasterConnectSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

// Implementation
protected:
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MASTERCONNECTSOCKET_H__573A6893_E6D3_483A_BEDF_19030B59C05B__INCLUDED_)
na_he 2008-05-28
  • 打赏
  • 举报
回复
刚开始使用什么定义的亚!如果是你自己写得类,可能就是你继承的问题了,呵呵!
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
发现巨大问题。如果我将代码改成:
BOOL bFlag;
CAsyncSocket kk;//和开始不相同的地方

kk.ShutDown(2);
kk.m_hSocket=INVALID_SOCKET;

bFlag=kk.Create(0,SOCK_STREAM,FD_CONNECT,NULL);
if (!bFlag)
{
AfxMessageBox("Create Socket Error!");
kk.Close();
PostQuitMessage(0);
}
else
{
char svraddr[256];
UINT svrport;
svrport=LISTENPORT;
memcpy(svraddr,"192.168.89.129",sizeof(svraddr));
kk.AsyncSelect(FD_CONNECT);
bFlag=kk.Connect(svraddr,svrport);//原来此处报错

if(!bFlag)
{
AfxMessageBox("Connect Socket Error!");
kk.Close();
PostQuitMessage(0);
}
}
运行程序,一切正常。这是怎么回事?难道是我继承时出了问题?!
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
我的环境是vc6、xp操作系统、安装有瑞星防火墙、系统绑定多个IP。
Eleven 2008-05-28
  • 打赏
  • 举报
回复
Up
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
是呀,但是不明白错在哪?我的代码写法错在哪?
m_master_connect_socket变量类型是我自己的类,此类继承自CAsyncSocket。
stivenjia 2008-05-28
  • 打赏
  • 举报
回复
内存访问违规。
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
能够点明我需要检查哪些地方吗?因为我实在发现不了到底问题出在哪?
独钓寒江雪027 2008-05-28
  • 打赏
  • 举报
回复
VC++网络编程群:58073606,欢迎加入一起讨论技术!
zhaowenbin 2008-05-28
  • 打赏
  • 举报
回复
谁能告诉我原因?或者我继承时错在哪?或者我继承使少写了什么?从而导致当前程序的错误
stivenjia 2008-05-27
  • 打赏
  • 举报
回复

char svraddr[256];
UINT svrport;
svrport=LISTENPORT;
//memcpy(svraddr,"192.168.89.129",sizeof(svraddr));
m_master_connect_socket.AsyncSelect(FD_CONNECT);
bFlag=m_master_connect_socket.Connect("192.168.89.129",svrport);//此处报错

if(!bFlag)
{
AfxMessageBox("Connect Socket Error!");
m_master_connect_socket.Close();
PostQuitMessage(0);
}

如果还报错说明是SOCKET的使用问题检查其他地方把
zhaowenbin 2008-05-27
  • 打赏
  • 举报
回复
是的。我在memcpy(svraddr,"192.168.89.129",sizeof(svraddr));之前加了如下代码:
memset(svraddr,0,sizeof(svraddr));

运行后错误还是同开始一样。
僵哥 2008-05-27
  • 打赏
  • 举报
回复
我只想知道

如4楼所说在memcpy(svraddr,"192.168.89.129",sizeof(svraddr));
前先memset清空svraddr.

这个楼主做了没?
加载更多回复(24)

18,356

社区成员

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

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