谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket
这是一个精练的客户端套接字类,类名、函数名和变量名均采用匈牙利命名法。小写的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()
- /////////////////////////////////////////////////////////////////////////////
- // CSomeClass message handlers
- LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam)
- {
- if (WSAGETSELECTERROR(lParam) != )
- return ;
- int nEvent = WSAGETSELECTEVENT(lParam);
- switch (nEvent)
- {
- case FD_ACCEPT: OnSocketAccept(wParam); break;
case FD_CLOSE: OnSocketClose(wParam); break;
case FD_READ: OnSocketRead(wParam); break;
default: break;- }
- return ;
- }
void CSomeClass::OnSocketRead(WPARAM wParam)- {
- if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
- {
- m_csRemoteHost.SelectEvent(FD_CLOSE);
- SOME_DATA_STRUCT data = {};
- 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 = ;
- CSomeClass* pThis = (CSomeClass*)hwnd;
- if (pThis != )
- 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...
下载
谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket的更多相关文章
- 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket
这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...
- 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket
这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...
- 谢欣伦 - OpenDev原创教程 - 串口类CxSerial
这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...
- 谢欣伦 - OpenDev原创教程 - 网络设备查找类CxNetworkHostFind & CxNetworkAdapterFind
这是一个精练的网络设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxNetworkHostFind的使用如下: void ...
- 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind
这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...
- 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind & CxDeviceMapFind
这是一个精练的设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxDeviceFind的使用如下: void CUsbSc ...
随机推荐
- jquery 扩展插件方法
分析插件jquery.countdown.js (function($) { $.fn.countdown = function(options) { // default options var d ...
- 超级详细Tcpdump 的用法
1.抓取回环网口的包:tcpdump -i lo 2.防止包截断:tcpdump -s0 3.以数字显示主机及端口:tcpdump -n 第一种是关于类型的关键字,主要包括host,net,port, ...
- iOS UIStackView的理解
iOS9 提供的UIStackview简化了布局操作,它有些像Android中的liner layout.以前不用UIStackview也是可以做出类似的效果的,不过要添加许多的约束,看得头都大了,使 ...
- resin 安装配置
resin (下载免费版 4) 前提:已经安装了Java运行环境,resin的安装需要jdk的支持 一.安装 1.cd /usr/local/src wget http://www.caucho. ...
- 个人Win10 +archlinux安装笔记
win10+archlinux 1.查看磁盘并分区并挂载1.1 分区/dev/sda1 WIN10 保留分区/dev/sda2 WIN10 ESP分区(EFI)/dev/sda3 WIN10 MSR分 ...
- SQL查询第m条到第n条的方法
SQL查询第m条到第n条的方法 如表名为GOOD Sselect top (n-m) * from GOODS where (某一列名) not in (select top m (某一列名) fro ...
- 使用MultipartEntity进行post请求的默认MIME类型
MultipartEntity .FileBody的默认MIME类型:application/octet-stream
- VR系统的分类
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 根据用户参与和沉浸感的程度,通常把虚拟现实分为4大类:桌面虚拟现实系统.沉浸式虚拟现实系统.增强虚拟现实 ...
- 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】
1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...
- RHCS 6.5 由于resource-agents-3.9.2-40.el6版本过低导致rgmanager[61164]: [fs] umount failed - REBOOTING问题的解决
問題描述: RHEL 6.5版本RHCS在disable或者relocate service的時候,會導致節點重啟,查看日誌顯示umount掛载點失敗,日誌如下: Nov 29 16:03:50 ph ...