化繁为简系列原创教程 - 通信专题 - 客户端套接字类CxClientSocket的应用
添加时间:2013-8-9 点击量:
这是一个小巧的客户端套接字类,类名、函数名和变量名均采取匈牙利定名法。小写的x代表我的姓氏首字母(谢欣能),小我习惯罢了,如有类似,纯属偶合。
CxClientSocket的应用如下(以某个叫做CSomeClass的类的相干代码为例):
一、声明客户端套接字对象实例。
CxClientSocket m_csRemoteHost;
二、设置客户端套接字接管缓冲区事务通知体式格式。消息响应或回调函数,任选其一。
void CSomeClass::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
HWND hwnd = GetSafeHwnd();
MSG msg = {hwnd, WM_SOCKET_EVENT};
m_usRemoteHost.SetWindowMessage(&msg);
m_csRemoteHost.SetWindowMessage(&msg);
m_ssLocalHost.SetWindowMessage(&msg);
if (m_btCSMode == CSM_SERVER)
ListenRemoteHost();
CStatic::PreSubclassWindow();
}
三、连接长途主机。
BOOL CSomeClass::ConnectToRemoteHost()
{
if (m_csRemoteHost.IsConnected())
m_csRemoteHost.DisConnect();
BOOL bRet = m_csRemoteHost.Connect(m_ipapRemoteHost.szAddr,
m_ipapRemoteHost.nPort);
return bRet;
}
四、处理惩罚消息响应或函数回调。
1.消息响应
BEGIN_MESSAGE_MAP(CSomeClass, CStatic)
//{{AFX_MSG_MAP(CSomeClass)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SOCKET_EVENT, OnSocketEvent)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CO2CPbySocket message handlers
LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam)
{
if (WSAGETSELECTERROR(lParam) != 0)
return 1;
int nEvent = WSAGETSELECTEVENT(lParam);
switch (nEvent)
{
case FD_CLOSE: OnSocketClose(wParam); break;
case FD_READ: OnSocketRead(wParam); break;
default: break;
}
return 1;
}
void CSomeClass::OnSocketRead(WPARAM wParam)
{
if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
{
m_csRemoteHost.SelectEvent(FD_CLOSE);
SOME_DATA_STRUCT data = {0};
if (m_csRemoteHost.Recv((LPBYTE)&data, sizeof(data)))
{
//do something with data;
}
m_csRemoteHost.SelectEvent(FD_READ | FD_CLOSE);
}
}
void CSomeClass::OnSocketClose(WPARAM wParam)
{
if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
{
m_csRemoteHost.DisConnect();
char szDebug[MAX_PATH];
sprintf(szDebug, %s disconnect.\n, m_szRemoteHostName);
OutputDebugString(szDebug);
GetParent()->PostMessage(WM_SOCKET_EVENT, (WPARAM)this, FD_CLOSE);
}
}
2.回调函数
LRESULT CALLBACK CSomeClass::SocketProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 0;
CSomeClass pThis = (CSomeClass)GetWindowLong(hwnd, GWL_USERDATA);
if (pThis != 0)
lRet = pThis->OnSocketEvent(wParam, lParam);
return lRet;
}
重视,在应用回调函数时应设置无连接套接字接管缓冲区事务通知体式格式为回调函数,并且设法把this指针传入设置函数,便利在回调函数中调用成员函数。
MSG msg = {(HWND)this, WM_SOCKET_EVENT};
m_csRemoteHost.SetWindowMessage(&msg, SocketProc);
五、断开与长途主机的连接。
void CSomeClass::OnDestroy()
{
CStatic::OnDestroy();
// TODO: Add your message handler code here
TerminateWaitComm();
m_csRemoteHost.DisConnect();
m_ssLocalHost.DisListen();
m_usRemoteHost.Disbind();
}
至于客户端套接字数据发送,很简单,在须要处调用以下函数:
m_csRemoteHost.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));
我写的很多实用类都很是简洁,一般都没有注释,有也是中英文混搭两句,大师习惯就好。To be continued...
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
这是一个小巧的客户端套接字类,类名、函数名和变量名均采取匈牙利定名法。小写的x代表我的姓氏首字母(谢欣能),小我习惯罢了,如有类似,纯属偶合。
CxClientSocket的应用如下(以某个叫做CSomeClass的类的相干代码为例):
一、声明客户端套接字对象实例。
CxClientSocket m_csRemoteHost;
二、设置客户端套接字接管缓冲区事务通知体式格式。消息响应或回调函数,任选其一。
void CSomeClass::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
HWND hwnd = GetSafeHwnd();
MSG msg = {hwnd, WM_SOCKET_EVENT};
m_usRemoteHost.SetWindowMessage(&msg);
m_csRemoteHost.SetWindowMessage(&msg);
m_ssLocalHost.SetWindowMessage(&msg);
if (m_btCSMode == CSM_SERVER)
ListenRemoteHost();
CStatic::PreSubclassWindow();
}
三、连接长途主机。
BOOL CSomeClass::ConnectToRemoteHost()
{
if (m_csRemoteHost.IsConnected())
m_csRemoteHost.DisConnect();
BOOL bRet = m_csRemoteHost.Connect(m_ipapRemoteHost.szAddr,
m_ipapRemoteHost.nPort);
return bRet;
}
四、处理惩罚消息响应或函数回调。
1.消息响应
BEGIN_MESSAGE_MAP(CSomeClass, CStatic)
//{{AFX_MSG_MAP(CSomeClass)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SOCKET_EVENT, OnSocketEvent)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CO2CPbySocket message handlers
LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam)
{
if (WSAGETSELECTERROR(lParam) != 0)
return 1;
int nEvent = WSAGETSELECTEVENT(lParam);
switch (nEvent)
{
case FD_CLOSE: OnSocketClose(wParam); break;
case FD_READ: OnSocketRead(wParam); break;
default: break;
}
return 1;
}
void CSomeClass::OnSocketRead(WPARAM wParam)
{
if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
{
m_csRemoteHost.SelectEvent(FD_CLOSE);
SOME_DATA_STRUCT data = {0};
if (m_csRemoteHost.Recv((LPBYTE)&data, sizeof(data)))
{
//do something with data;
}
m_csRemoteHost.SelectEvent(FD_READ | FD_CLOSE);
}
}
void CSomeClass::OnSocketClose(WPARAM wParam)
{
if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
{
m_csRemoteHost.DisConnect();
char szDebug[MAX_PATH];
sprintf(szDebug, %s disconnect.\n, m_szRemoteHostName);
OutputDebugString(szDebug);
GetParent()->PostMessage(WM_SOCKET_EVENT, (WPARAM)this, FD_CLOSE);
}
}
2.回调函数
LRESULT CALLBACK CSomeClass::SocketProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = 0;
CSomeClass pThis = (CSomeClass)GetWindowLong(hwnd, GWL_USERDATA);
if (pThis != 0)
lRet = pThis->OnSocketEvent(wParam, lParam);
return lRet;
}
重视,在应用回调函数时应设置无连接套接字接管缓冲区事务通知体式格式为回调函数,并且设法把this指针传入设置函数,便利在回调函数中调用成员函数。
MSG msg = {(HWND)this, WM_SOCKET_EVENT};
m_csRemoteHost.SetWindowMessage(&msg, SocketProc);
五、断开与长途主机的连接。
void CSomeClass::OnDestroy()
{
CStatic::OnDestroy();
// TODO: Add your message handler code here
TerminateWaitComm();
m_csRemoteHost.DisConnect();
m_ssLocalHost.DisListen();
m_usRemoteHost.Disbind();
}
至于客户端套接字数据发送,很简单,在须要处调用以下函数:
m_csRemoteHost.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));
我写的很多实用类都很是简洁,一般都没有注释,有也是中英文混搭两句,大师习惯就好。To be continued...
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》