出错信息:
Unhandled exception in BtoB.exe:0x0000005:Access viloiation
点确定,指向出错地方,函数:
void CSocketComm::SetServerPortNo(ULong uPortNo)
{
m_nsvrPortNo=nPortNo;//指向这里,nPortNo传过来是8888端口号
}
CSocketComm类头文件如下:
class CSocketComm
{
public:
BOOL CloseSocket(UINT nFlag);
BOOL AcceptFromClient(UINT nTimeOut);
BOOL ConnectServer(UINT nTimeOut);
void SetServerPortNo(ULONG nPortNo);
CAsyncSocket* m_cltSocket;
CAsyncSocket* m_newsvrSkt;
CSocketComm();
virtual ~CSocketComm();
private:
ULONG m_nPortNo;
ULONG m_nsvrPortNo;
CString m_strAddr;
};
CSocketComm类执行文件如下:
#include "stdafx.h"
#include "SocketComm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CSocketComm::CSocketComm()
{
}CSocketComm::~CSocketComm()
{
}
//服务端时设置本地守候端口号
void CSocketComm::SetServerPortNo(ULONG nPortNo)
{
m_nsvrPortNo = nPortNo;
}//服务端守候客户端连接
BOOL CSocketComm::AcceptFromClient(UINT nTimeOut)
{
char msg[200];
CAsyncSocket *svrSocket;
DWORD t0;
bool nFlag=true;
UINT TimeOut = 4; svrSocket = new CAsyncSocket;
if (!svrSocket->Create(m_nsvrPortNo, SOCK_STREAM, 0L))
{
sprintf(msg, "服务端TCP建立错误!GetLastError=[%d]", GetLastError());
//ErrLog(msg);
delete svrSocket;
return FALSE;
}
if(!svrSocket->Listen())
{
sprintf(msg, "服务端TCP Listen错误!GetLastError=[%d]", GetLastError());
//ErrLog(msg);
svrSocket->Close();
delete svrSocket;
return FALSE;
}
m_newsvrSkt = new CAsyncSocket;
nFlag=true;
t0=GetTickCount();
while((GetTickCount() - t0) <= (TimeOut-1)*1000)
{
if (!svrSocket->Accept(*m_newsvrSkt))
{
nFlag = false;
Sleep(10);
continue;
}
else
{
nFlag = true;
break;
}
}
if (!nFlag)
{
svrSocket->Close();
delete svrSocket;
delete m_newsvrSkt;
return FALSE;
} svrSocket->Close();
delete svrSocket; return TRUE;
}
是不是调用类函数出错了?
在主对话框类CBtoBDlg.cpp中
#include "SocketComm.h"
......
CSocketComm *aaa;
aaa->SetServerPortNo(8888);//???这步调用出错
Unhandled exception in BtoB.exe:0x0000005:Access viloiation
点确定,指向出错地方,函数:
void CSocketComm::SetServerPortNo(ULong uPortNo)
{
m_nsvrPortNo=nPortNo;//指向这里,nPortNo传过来是8888端口号
}
CSocketComm类头文件如下:
class CSocketComm
{
public:
BOOL CloseSocket(UINT nFlag);
BOOL AcceptFromClient(UINT nTimeOut);
BOOL ConnectServer(UINT nTimeOut);
void SetServerPortNo(ULONG nPortNo);
CAsyncSocket* m_cltSocket;
CAsyncSocket* m_newsvrSkt;
CSocketComm();
virtual ~CSocketComm();
private:
ULONG m_nPortNo;
ULONG m_nsvrPortNo;
CString m_strAddr;
};
CSocketComm类执行文件如下:
#include "stdafx.h"
#include "SocketComm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CSocketComm::CSocketComm()
{
}CSocketComm::~CSocketComm()
{
}
//服务端时设置本地守候端口号
void CSocketComm::SetServerPortNo(ULONG nPortNo)
{
m_nsvrPortNo = nPortNo;
}//服务端守候客户端连接
BOOL CSocketComm::AcceptFromClient(UINT nTimeOut)
{
char msg[200];
CAsyncSocket *svrSocket;
DWORD t0;
bool nFlag=true;
UINT TimeOut = 4; svrSocket = new CAsyncSocket;
if (!svrSocket->Create(m_nsvrPortNo, SOCK_STREAM, 0L))
{
sprintf(msg, "服务端TCP建立错误!GetLastError=[%d]", GetLastError());
//ErrLog(msg);
delete svrSocket;
return FALSE;
}
if(!svrSocket->Listen())
{
sprintf(msg, "服务端TCP Listen错误!GetLastError=[%d]", GetLastError());
//ErrLog(msg);
svrSocket->Close();
delete svrSocket;
return FALSE;
}
m_newsvrSkt = new CAsyncSocket;
nFlag=true;
t0=GetTickCount();
while((GetTickCount() - t0) <= (TimeOut-1)*1000)
{
if (!svrSocket->Accept(*m_newsvrSkt))
{
nFlag = false;
Sleep(10);
continue;
}
else
{
nFlag = true;
break;
}
}
if (!nFlag)
{
svrSocket->Close();
delete svrSocket;
delete m_newsvrSkt;
return FALSE;
} svrSocket->Close();
delete svrSocket; return TRUE;
}
是不是调用类函数出错了?
在主对话框类CBtoBDlg.cpp中
#include "SocketComm.h"
......
CSocketComm *aaa;
aaa->SetServerPortNo(8888);//???这步调用出错
解决方案 »
- VS 2005 MFC工程制作安装包.
- 多网卡通信,客户端IP固定!
- 怎么样把工具栏可托到菜单栏上,和菜单栏同在一栏上。
- 下午没有工作。烦呀
- 是建一个类好呢?还是建API函数好呢?
- CRecordset记录集只能显示,不能删除和添加记录?
- 请问大家都用什么写C/S程序?
- 谁有《COM与COM+入门到精通》的源代码
- Socket的多线程问题?高手们集中来讨论一下吧!!!
- 请问如何实现在CListCtrl和CTreeList间的拖动
- 谁知道最常用的系统,工具等都上用什么开发的?
- 郁闷:同一个dll在com+里注册导出的*.cab在其他机子上可用,但当用cabarc.exe打的*.cab包却不能自动下载安装?详细请进......
aaa = new CSocketComm;
CSocketComm*aaa;
aaa=newCSocketComm();
aaa->SetServerPortNo(8888);
CSocketComm *aaa;
aaa=new CSocketComm;
aaa->SetServerPortNo(8888);
if(!aaa->AcceptFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
aaa->SetServerPortNo(8866);
if(!aaa->AcceptFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
需要上面这样吗?
,
CPtrList SockList;
CSocketComm *aaa;
aaa=new CSocketComm;
aaa->SetServerPortNo(8888);
if(!aaa->AcceptFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
SockList.AddTail(aaa);
aaa = new CSocketComm;
if(!aaa->AccepteFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
SockList.AddTail(aaa);
用的时候再去出来就可以了
CPtrList SockList;
CSocketComm *aaa;
aaa=new CSocketComm;
aaa->SetServerPortNo(8888);
if(!aaa->AcceptFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
SockList.AddTail(aaa);
aaa = new CSocketComm;
aaa->SetServerPortNo(8866);
if(!aaa->AccepteFromClient(1000))
{
AfxMessageBox("侦听出错");
return;
}
SockList.AddTail(aaa);
上面过程以后,已经接受A机和B机的连接了。那应该是接受和发送数据了
Void CBtoBDlg::GetData()
{
//这里怎么知道是那台机发过来呢?
//怎么从列表SockList里取出来
//假设A机和B机都有数据发送过来
}