这是一个精练的客户端套接字类,类名、函数名和变量名均采用匈牙利命名法。小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合。

CxClientSocket的使用如下(以某个叫做CSomeClass的类的相关代码为例):

一、声明客户端套接字对象实例。

  1. CxClientSocket m_csRemoteHost;

二、设置客户端套接字事件通知方式。消息响应或回调函数,任选其一。客户端套接字事件有:缓冲区有数据可读取、与远程主机的连接被断开。

  1. void CSomeClass::PreSubclassWindow()
  2. {
  3. // TODO: Add your specialized code here and/or call the base class
  4. HWND hwnd = GetSafeHwnd();
  5. MSG msg = {hwnd, WM_SOCKET_EVENT};
  6. m_usRemoteHost.SetWindowMessage(&msg);
  7. m_csRemoteHost.SetWindowMessage(&msg);
  8. m_ssLocalHost.SetWindowMessage(&msg);
  9.  
  10. if (m_btCSMode == CSM_SERVER)
  11. ListenRemoteHost();
  12.  
  13. CStatic::PreSubclassWindow();
  14. }

三、连接远程主机。

  1. BOOL CSomeClass::ConnectToRemoteHost()
  2. {
  3. if (m_csRemoteHost.IsConnected())
  4. m_csRemoteHost.DisConnect();
  5.  
  6. BOOL bRet = m_csRemoteHost.Connect(m_ipapRemoteHost.szAddr,
  7. m_ipapRemoteHost.nPort);
  8.  
  9. return bRet;
  10. }

四、处理消息响应或函数回调。
1.消息响应

  1. BEGIN_MESSAGE_MAP(CSomeClass, CStatic)
  2. //{{AFX_MSG_MAP(CSomeClass)
  3. ON_WM_DESTROY()
  4. //}}AFX_MSG_MAP
  5. ON_MESSAGE(WM_SOCKET_EVENT, OnSocketEvent)
  6. END_MESSAGE_MAP()
  7.  
  8. /////////////////////////////////////////////////////////////////////////////
  9. // CSomeClass message handlers
  10.  
  11. LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam)
  12. {
  13. if (WSAGETSELECTERROR(lParam) != )
  14. return ;
  15.  
  16. int nEvent = WSAGETSELECTEVENT(lParam);
  17. switch (nEvent)
  18. {
  19.       case FD_ACCEPT: OnSocketAccept(wParam); break;
          case FD_CLOSE: OnSocketClose(wParam); break;
          case FD_READ: OnSocketRead(wParam); break;
      default: break;
  20. }
  21.  
  22. return ;
  23. }

  24. void CSomeClass::OnSocketRead(WPARAM wParam)
  25. {
  26. if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
  27. {
  28. m_csRemoteHost.SelectEvent(FD_CLOSE);
  29. SOME_DATA_STRUCT data = {};
  30. if (m_csRemoteHost.Recv((LPBYTE)&data, sizeof(data)))
  31. {
          //do something with data;
         }
  32. m_csRemoteHost.SelectEvent(FD_READ | FD_CLOSE);
  33. }
  34. }
  35.  
  36. void CSomeClass::OnSocketClose(WPARAM wParam)
  37. {
  38. if (m_csRemoteHost.GetSocket() == (SOCKET)wParam)
  39. {
  40. m_csRemoteHost.DisConnect();
  41. char szDebug[MAX_PATH];
  42. sprintf(szDebug, "%s disconnect.\n", m_szRemoteHostName);
  43. OutputDebugString(szDebug);
  44. GetParent()->PostMessage(WM_SOCKET_EVENT, (WPARAM)this, FD_CLOSE);
  45. }
  46. }

2.回调函数

  1. LRESULT CALLBACK CSomeClass::SocketProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {
  3. LRESULT lRet = ;
  4. CSomeClass* pThis = (CSomeClass*)hwnd;
  5. if (pThis != )
  6. lRet = pThis->OnSocketEvent(wParam, lParam);
  7.  
  8. return lRet;
  9. }

注意,在使用回调函数时应设置客户端套接字事件通知方式为回调函数,并且设法把this指针传入设置函数,方便在回调函数中调用成员函数。

  1. MSG msg = {(HWND)this, WM_SOCKET_EVENT};
  2. m_csRemoteHost.SetWindowMessage(&msg, SocketProc);

五、断开与远程主机的连接。

  1. void CSomeClass::OnDestroy()
  2. {
  3. CStatic::OnDestroy();
  4.  
  5. // TODO: Add your message handler code here
  6. TerminateWaitComm();
  7.  
  8. m_csRemoteHost.DisConnect();
  9. m_ssLocalHost.DisListen();
  10. m_usRemoteHost.Disbind();
  11. }

  至于客户端套接字数据发送,很简单:在需要处调用以下函数:

  1. m_csRemoteHost.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));

  精练的代码不需要过多解释,你们懂的。To be continued...

下载

libComm - v1.2 For WinXP/Win7

谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket的更多相关文章

  1. 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket

    这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...

  2. 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket

    这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...

  3. 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia

    libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...

  4. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...

  5. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...

  6. 谢欣伦 - OpenDev原创教程 - 串口类CxSerial

    这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...

  7. 谢欣伦 - OpenDev原创教程 - 网络设备查找类CxNetworkHostFind & CxNetworkAdapterFind

    这是一个精练的网络设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxNetworkHostFind的使用如下: void ...

  8. 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind

    这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...

  9. 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind & CxDeviceMapFind

    这是一个精练的设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxDeviceFind的使用如下: void CUsbSc ...

随机推荐

  1. jquery 扩展插件方法

    分析插件jquery.countdown.js (function($) { $.fn.countdown = function(options) { // default options var d ...

  2. 超级详细Tcpdump 的用法

    1.抓取回环网口的包:tcpdump -i lo 2.防止包截断:tcpdump -s0 3.以数字显示主机及端口:tcpdump -n 第一种是关于类型的关键字,主要包括host,net,port, ...

  3. iOS UIStackView的理解

    iOS9 提供的UIStackview简化了布局操作,它有些像Android中的liner layout.以前不用UIStackview也是可以做出类似的效果的,不过要添加许多的约束,看得头都大了,使 ...

  4. resin 安装配置

    resin (下载免费版 4) 前提:已经安装了Java运行环境,resin的安装需要jdk的支持   一.安装 1.cd /usr/local/src wget http://www.caucho. ...

  5. 个人Win10 +archlinux安装笔记

    win10+archlinux 1.查看磁盘并分区并挂载1.1 分区/dev/sda1 WIN10 保留分区/dev/sda2 WIN10 ESP分区(EFI)/dev/sda3 WIN10 MSR分 ...

  6. SQL查询第m条到第n条的方法

    SQL查询第m条到第n条的方法 如表名为GOOD Sselect top (n-m) * from GOODS where (某一列名) not in (select top m (某一列名) fro ...

  7. 使用MultipartEntity进行post请求的默认MIME类型

    MultipartEntity .FileBody的默认MIME类型:application/octet-stream

  8. VR系统的分类

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 根据用户参与和沉浸感的程度,通常把虚拟现实分为4大类:桌面虚拟现实系统.沉浸式虚拟现实系统.增强虚拟现实 ...

  9. 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】

    1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...

  10. 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 ...