出错信息:
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);//???这步调用出错

解决方案 »

  1.   

    有这一步吗?
    aaa = new CSocketComm;
      

  2.   

    CSocketComm需要实例化后才能用。
    CSocketComm*aaa;
    aaa=newCSocketComm();
    aaa->SetServerPortNo(8888);
      

  3.   

    我能否问一下,如果按照上面的,服务器只跟二台客户进行通信,要创建二个侦听端口吗?
    CSocketComm *aaa;
    aaa=new CSocketComm;
    aaa->SetServerPortNo(8888);
    if(!aaa->AcceptFromClient(1000))
    {   
        AfxMessageBox("侦听出错");
        return;
    }
    aaa->SetServerPortNo(8866);
    if(!aaa->AcceptFromClient(1000))
    {   
        AfxMessageBox("侦听出错");
        return;
    }
    需要上面这样吗?
      

  4.   

    如果你要与堕胎计算机通讯,就得有多个Socket,你可以用一个链表保存起来

    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);
    用的时候再去出来就可以了
      

  5.   

    现在我就与二台计算机通信,A机:198.0.0.88;B机:198.0.0.66;
    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机都有数据发送过来
    }