服务端套接字类CxServerSocket的使用

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

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

一、声明服务端套接字对象实例。

  1. CxServerSocket m_ssLocalHost;

二、设置服务端套接字事件通知方式。消息响应或回调函数,任选其一。服务端套接字事件有:接收到客户端的连接请求。

  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::ListenRemoteHost()
  2. {
  3. char szIPAddr[MAX_IPV6];
  4. if (CxSocket::GetLocalHost(szIPAddr))
  5. return m_ssLocalHost.Listen(szIPAddr, NETPORT_NETWORK_COMM);
  6. else
  7. return FALSE;
  8. }

  NETPORT_NETWORK_COMM是一个自定义的TCP端口值,只要不与公用端口冲突就行。

四、处理消息响应或函数回调。
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) != 0)
  14. return 1;
  15.  
  16. int nEvent = WSAGETSELECTEVENT(lParam);
  17. switch (nEvent)
  18. {
  19.   case FD_ACCEPT: OnSocketAccept(wParam); break;
  20.   case FD_CLOSE: OnSocketClose(wParam); break;
  21.   case FD_READ: OnSocketRead(wParam); break;
  22.   default: break;
  23. }
  24.  
  25. return 1;
  26. }
  27.  
  28. void CSomeClass::OnSocketAccept(WPARAM wParam)
  29. {
  30. if ((SOCKET)wParam == m_ssLocalHost.GetSocket())
  31. {
  32. CxClientSocket xcs;
  33. xcs =m_ssLocalHost.Accept();
  34. if (xcs.GetSocket() != INVALID_SOCKET)
  35. {
  36. char szIPAddr[MAX_IPV6];
  37. xcs.GetRemoteHost(szIPAddr);
  38.  
  39. if (strcmp(szIPAddr, m_ipapRemoteHost.szAddr) == 0)
  40. m_csRemoteHost = xcs.GetSocket();
  41.        else
  42. {
  43. xcs.DisConnect();
  44.  
  45. CString str;
  46. str.Format("unknown socket %s disconnect.\n", szIPAddr);
  47. OutputDebugString(str);
  48. }
  49. }
  50. }
  51. }

2.回调函数

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

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

  1. MSG msg = {(HWND)this, WM_SOCKET_EVENT};
  2. m_ssRemoteHost.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. }

  至于服务端如何与客户端交换数据,很简单:将服务端接受的客户端连接赋给一个客户端套接字对象实例,然后让这个客户端套接字对象实例在需要处完成数据交换就可以了(客户端套接字类CxClientSocket如何使用?请查阅往期文章)。

  1. CxClientSocket xcs;
  2. xcs = m_ssLocalHost.Accept();
  3. // Save the expected socket and disconnect the unexpected socket
  4. m_csRemoteHost = xcs.GetSocket();

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

服务端套接字类CxServerSocket的使用的更多相关文章

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

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

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

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

  3. 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket

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

  4. C++套接字类CxUdpSocket的设计

    C++套接字类CxUdpSocket的设计 这是一个小巧的C++套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣能),个人习惯而已,如有雷同,纯属巧合. CxUdpS ...

  5. JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection

    常见的client和服务端 client:       浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端:       server:TomCat:1.处理请求 2.给予应答 想让TomC ...

  6. 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用

    一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...

  7. 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)

    查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...

  8. python套接字编程实现ntp服务和远程命令执行

    python套接字编程实现ntp服务和远程命令执行 目录 基于udp实现ntp服务 基于tcp实现远程命令执行 基于udp实现远程命令执行 tcp与udp的比较 前面关于套接字基础请查阅 https: ...

  9. 入门级:怎么使用C#进行套接字编程(二)

    入门级:怎么使用C#进行套接字编程(一) 原文地址如下: C# Server Socket program C# Client Socket program 代码环境:VS2010+Win8.1企业评 ...

随机推荐

  1. sql server int 列 NULLIF,isnull 判断是0还是1 ,如果是0就变成1

    SELECT ISNULL(NULLIF(col1,0),1) ISNULL:  第一个表达式 是 null 返回 第二个表达式,否则 返回 第一个 , ISNULL(表达式1,表达式2) if(表达 ...

  2. 使用微软 URL Rewrite Module 开启IIS伪静态

    原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...

  3. ASP.NET MVC应用程序把文字写在图片上

    原文:ASP.NET MVC应用程序把文字写在图片上 Insus.NET实现这篇<MVC把随机产生的字符串转换为图片>http://www.cnblogs.com/insus/p/3624 ...

  4. JS链表

    链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编 ...

  5. Java替换字符或十进制数的字符串

    如今,这个项目的需求:将"甲状腺结节 5*3 cm" 更换 "甲状腺结节 * cm". 在一个字符串的数字来替换空白. 码,如以下: public static ...

  6. C++中出现的计算机术语4

    adaptor(适配器) 一种标准库类型.函数或迭代器,使某种标准库类型.函数或迭代器的行为类似于第二种标准库类型.函数或迭代器.系统提供了三种顺序容器适配器:stack(栈).queue(队列)以及 ...

  7. 工欲善其事:编辑器之神Vim(一)

    本篇文章收集了Vim最常用和实用的一些命令,掌握这些命令就可以使用Vim了 本文仅列举个人认为常用的命令,本系列文章更像是自己的学习笔记,而不是VIM使用教程. 如果你想了解vim的更多,可以看看Co ...

  8. OCP-1Z0-051-题目解析-第1题

    1. View the Exhibit and examine the structure of the SALES, CUSTOMERS, PRODUCTS, and TIMES tables. T ...

  9. C#编程实践—EventBroker简单实现

    前言 话说EventBroker这玩意已经不是什么新鲜货了,记得第一次接触这玩意是在进第二家公司的时候,公司产品基础架构层中集成了分布式消息中间件,在.net基础服务层中使用EventBroker的模 ...

  10. ssis的script task作业失败(调用外部dll)

    原文 ssis的script task作业失败 我的ssis作业包里用了一个script task,会查询一个http的页面接口,获取json数据后解析然后做后续处理,其中解析json引用了本地目录下 ...