CAsyncSocket对象表示一个Windows Socket:一个网络通信的末端。CAsyncSocket类封闭了Windows套接字API,对想使用与MFC连接的Windows套接字的程序员提供了一个面向对象的抽象化概念。
此类是假设已经理解了网络的通信的前提下的。负责处理块、字节排序差异以及Unicode和多个字符集(MBCS)串的对话。如果想要一个更方便的处理这些问题的接口,请参阅CSocket类。
要使用一个CAsyncSocket对象,调用它的构造程序,然后调用Create函数,创建一个基础套接字句柄(SOCKET类型),除了接收型套接字之外。对于一个服务器套接字调用Listen成员函数,对于一个客户套接字调用Connect成员函数。在接收一个连接请求时,服务器套接字应该调用一个Accept函数。使用保留的CAsyncSocket函数解决套接字之间的通信。完成之后,如果它是在堆上被创建的,就废弃掉CAsyncSocket对象。析构程序自动调用Close函数。SOCKET数据类型在联机文档“Visual C++程序员指南”中的“Windows套接字背景”章节中有所描述。
如果要了解更多信息,请参阅联机文档 “Visual C++程序员指南”中的“Windows套接字:使用CAsyncSocket类”和相关章节以及联机文档“Win32 SDK”中的“Windows套接字2的概述”和“Windows套接字编程指南”。
#include <afxsock.h>
继承CAsyncSocket类,创建自己的类CMySocket,在mySocket.h头文件中,如下
此类是假设已经理解了网络的通信的前提下的。负责处理块、字节排序差异以及Unicode和多个字符集(MBCS)串的对话。如果想要一个更方便的处理这些问题的接口,请参阅CSocket类。
要使用一个CAsyncSocket对象,调用它的构造程序,然后调用Create函数,创建一个基础套接字句柄(SOCKET类型),除了接收型套接字之外。对于一个服务器套接字调用Listen成员函数,对于一个客户套接字调用Connect成员函数。在接收一个连接请求时,服务器套接字应该调用一个Accept函数。使用保留的CAsyncSocket函数解决套接字之间的通信。完成之后,如果它是在堆上被创建的,就废弃掉CAsyncSocket对象。析构程序自动调用Close函数。SOCKET数据类型在联机文档“Visual C++程序员指南”中的“Windows套接字背景”章节中有所描述。
如果要了解更多信息,请参阅联机文档 “Visual C++程序员指南”中的“Windows套接字:使用CAsyncSocket类”和相关章节以及联机文档“Win32 SDK”中的“Windows套接字2的概述”和“Windows套接字编程指南”。
#include <afxsock.h>
继承CAsyncSocket类,创建自己的类CMySocket,在mySocket.h头文件中,如下
#ifndef __SOCKET__
#define __SOCKET__
#include "mainUnit1.h" //窗口的头文件
class CMySocket : public CAsyncSocket
{
public:
void SetParent(TForm *pDlg);
CMySocket(){AfxSocketInit();};
virtual ~CMySocket(){};
protected:
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnAccept(int nErrorCode);
private:
TForm1 *m_pDlg;
};
void CMySocket::SetParent(TForm *pDlg) //设置传入窗口类的指针
{
m_pDlg =(TForm1*)pDlg;
}
void CMySocket::OnAccept(int nErrorCode) //事件处理函数
{
if(nErrorCode==0)
{
((TForm1*)m_pDlg)->OnAccept(); //调用窗口类中的OnAccept成员函数
}
}
void CMySocket::OnConnect(int nErrorCode) //事件处理函数
{
if(nErrorCode==0)
{
((TForm1*)m_pDlg)->OnConnect(); //调用窗口类中的OnConnect成员函数
}
}
void CMySocket::OnReceive(int nErrorCode) //事件处理函数
{
((TForm1*)m_pDlg)->OnReceive(); //调用窗口类中的OnReceive成员函数
}
void CMySocket::OnClose(int nErrorCode) //事件处理函数
{
((TForm1*)m_pDlg)->OnClose(); //调用窗口类中的OnClose成员函数
}
#endif
作为服务器的窗口代码,如下:
#include "mySocket.h"
CMySocket m_sConnectSocket;
CMySocket m_sListenSocket;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
m_sListenSocket.SetParent(this);
m_sConnectSocket.SetParent(this);
//创建服务器端,并开始监听
bool re = m_sListenSocket.Create(8000);
re = m_sListenSocket.Listen();
}
void TForm1::OnClose()
{
}
void TForm1::OnReceive()
{
char* pBuf=new char[1025];
int nBufSize=1024;
int nReceived = m_sConnectSocket.Receive(pBuf,1024);
if(nReceived!=SOCKET_ERROR)
{
pBuf[nReceived] = 0;
ShowMessage(pBuf);
delete []pBuf;
}
else
ShowMessage("接收信息错误");
}
void TForm1::OnConnect()
{
ShowMessage("客户端连接");
}
void TForm1::OnAccept()
{
ShowMessage("接受客户端");
m_sListenSocket.Accept(m_sConnectSocket);
}
客户端代码如下:
#include "mySocket.h"
CMySocket Client;
void __fastcall TForm1::Button7Click(TObject *Sender)
{
bool re = Client.Create();
re = Client.Connect("Localhost",8000);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button8Click(TObject *Sender)
{
CString msg = "hello";
int nSent = Client.Send(LPCTSTR(msg),msg.GetLength());
}