服务端套接字类CxServerSocket的使用
服务端套接字类CxServerSocket的使用
这是一个精练的服务端套接字类,类名、函数名和变量名均采用匈牙利命名法。小写的x代表我的姓氏首字母(谢欣能),个人习惯而已,如有雷同,纯属巧合。
CxServerSocket的使用如下(以某个叫做CSomeClass的类的相关代码为例):
一、声明服务端套接字对象实例。
- CxServerSocket m_ssLocalHost;
二、设置服务端套接字事件通知方式。消息响应或回调函数,任选其一。服务端套接字事件有:接收到客户端的连接请求。

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

NETPORT_NETWORK_COMM是一个自定义的TCP端口值,只要不与公用端口冲突就行。
四、处理消息响应或函数回调。
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) != 0)
- return 1;
- 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 1;
- }
- void CSomeClass::OnSocketAccept(WPARAM wParam)
- {
- if ((SOCKET)wParam == m_ssLocalHost.GetSocket())
- {
- CxClientSocket xcs;
- xcs =m_ssLocalHost.Accept();
- if (xcs.GetSocket() != INVALID_SOCKET)
- {
- char szIPAddr[MAX_IPV6];
- xcs.GetRemoteHost(szIPAddr);
- if (strcmp(szIPAddr, m_ipapRemoteHost.szAddr) == 0)
- m_csRemoteHost = xcs.GetSocket();
- else
- {
- xcs.DisConnect();
- CString str;
- str.Format("unknown socket %s disconnect.\n", szIPAddr);
- OutputDebugString(str);
- }
- }
- }
- }

2.回调函数

- LRESULT CALLBACK CSomeClass::SocketProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- LRESULT lRet = 0;
- CSomeClass* pThis = (CSomeClass*)hwnd;
- if (pThis != 0)
- lRet = pThis->OnSocketEvent(wParam, lParam);
- return lRet;
- }

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

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

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

- CxClientSocket xcs;
- xcs = m_ssLocalHost.Accept();
- // Save the expected socket and disconnect the unexpected socket
- m_csRemoteHost = xcs.GetSocket();

精练的代码不需要过多解释,你们懂的。To be continued...
服务端套接字类CxServerSocket的使用的更多相关文章
- 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket
这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...
- 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket
这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...
- 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket
这是一个精练的客户端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxClientSocket的使用如下(以某个叫做CSo ...
- C++套接字类CxUdpSocket的设计
C++套接字类CxUdpSocket的设计 这是一个小巧的C++套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣能),个人习惯而已,如有雷同,纯属巧合. CxUdpS ...
- JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection
常见的client和服务端 client: 浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端: server:TomCat:1.处理请求 2.给予应答 想让TomC ...
- 《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
一.软件开发的机构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:QQ.微信.网盘等这一类是属于需要安装的桌面应用 第二种是web类:比如百度.知乎.博客园等使用浏览器访问 ...
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- python套接字编程实现ntp服务和远程命令执行
python套接字编程实现ntp服务和远程命令执行 目录 基于udp实现ntp服务 基于tcp实现远程命令执行 基于udp实现远程命令执行 tcp与udp的比较 前面关于套接字基础请查阅 https: ...
- 入门级:怎么使用C#进行套接字编程(二)
入门级:怎么使用C#进行套接字编程(一) 原文地址如下: C# Server Socket program C# Client Socket program 代码环境:VS2010+Win8.1企业评 ...
随机推荐
- sql server int 列 NULLIF,isnull 判断是0还是1 ,如果是0就变成1
SELECT ISNULL(NULLIF(col1,0),1) ISNULL: 第一个表达式 是 null 返回 第二个表达式,否则 返回 第一个 , ISNULL(表达式1,表达式2) if(表达 ...
- 使用微软 URL Rewrite Module 开启IIS伪静态
原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...
- ASP.NET MVC应用程序把文字写在图片上
原文:ASP.NET MVC应用程序把文字写在图片上 Insus.NET实现这篇<MVC把随机产生的字符串转换为图片>http://www.cnblogs.com/insus/p/3624 ...
- JS链表
链表 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编 ...
- Java替换字符或十进制数的字符串
如今,这个项目的需求:将"甲状腺结节 5*3 cm" 更换 "甲状腺结节 * cm". 在一个字符串的数字来替换空白. 码,如以下: public static ...
- C++中出现的计算机术语4
adaptor(适配器) 一种标准库类型.函数或迭代器,使某种标准库类型.函数或迭代器的行为类似于第二种标准库类型.函数或迭代器.系统提供了三种顺序容器适配器:stack(栈).queue(队列)以及 ...
- 工欲善其事:编辑器之神Vim(一)
本篇文章收集了Vim最常用和实用的一些命令,掌握这些命令就可以使用Vim了 本文仅列举个人认为常用的命令,本系列文章更像是自己的学习笔记,而不是VIM使用教程. 如果你想了解vim的更多,可以看看Co ...
- OCP-1Z0-051-题目解析-第1题
1. View the Exhibit and examine the structure of the SALES, CUSTOMERS, PRODUCTS, and TIMES tables. T ...
- C#编程实践—EventBroker简单实现
前言 话说EventBroker这玩意已经不是什么新鲜货了,记得第一次接触这玩意是在进第二家公司的时候,公司产品基础架构层中集成了分布式消息中间件,在.net基础服务层中使用EventBroker的模 ...
- ssis的script task作业失败(调用外部dll)
原文 ssis的script task作业失败 我的ssis作业包里用了一个script task,会查询一个http的页面接口,获取json数据后解析然后做后续处理,其中解析json引用了本地目录下 ...