CSocket类是CAsyncSocket类的派生类,它继承了Windows Socket API封装函数。它实现了比CAsyncSocket类对Windows Sockets更高层的抽象。它与CSocketFile类和CArchive类合作完成对数据的发送、接收的管理,并提供了对于同步操作CArchive对象非常重要的阻塞功能,使程序员在管理数据的发送和接收的工作变得简单。本篇只介绍如何使用CSocket类实现网络连接,更多内容请见后续更新。
简要步骤:
1服务器端:
(1)创建CSocket对象
(2)调用CSocket::Create()函数
(3)调用CSocket::Listen()进行监听
(4)如有客户端连接则调用CSocket::Accept()进行接收连接。(注:此函数无需人为调用,CSocket类会自动调用)
2客户端:
(1)创建CSocket对象
(2)调用CSocket::Create()函数
(3)调用CSocket::Connect()函数进行连接。
详细步骤:
1服务器端:
(1)首先从CSocket类继承一个新类CListeningSocket
(2)改写构造函数
CListeningSocket(Chorse_clientDlg* pDlg = NULL): m_pDlg(pDlg)
{
} //pDlg为欲在其中建立网络连接的类对象
(3)改写CListeningSocket类接收函数
void CListeningSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
m_pDlg->OnAccept();
CSocket::OnAccept(nErrorCode);
}
(4)为Chorse_clientDlg类添加函数
//此函数在客户端请求连接时,自动被调用
void Chorse_clientDlg::OnAccept(void)
{
CClientSocket* pSocket = new CClientSocket(this);
if(m_pSocket->Accept(*pSocket))
{}
else
delete m_pSocket;
}
在Chorse_clientDlg::OnInitDialog()中添加:
BOOL Chorse_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
................//此处略去不相关代码
// TODO: 在此添加额外的初始化代码
m_pSocket = new CListeningSocket(this);
if(!m_pSocket->Create(30512))
return FALSE;
if(!m_pSocket->Listen())
{
m_pSocket->Close();
return FALSE;
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
2客户端:
(1)首先从CSocket类继承一个新类CChatSocket
(2)改写构造函数
CChatSocket::CChatSocket(CAddHostDlg* pDlg)
: m_pDlg(pDlg)
{
} //pDlg为欲在其中建立网络连接的类对象
(3)建立连接请求
m_socket = new CChatSocket(this);
if(!m_socket->Create())
{
MessageBox(_T("无法建立套接字"));
return;
}
else if(!m_socket->Connect(strHostAddress, 30512))
{
MessageBox(_T("无法建立连接"));
m_socket->Close();
return;
} //至此,两端连接已建立,在此基础上可进行网络通信。