谢欣伦 - OpenDev原创教程 - 服务端套接字类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) != )
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::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) == )
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 = ;
CSomeClass* pThis = (CSomeClass*)hwnd;
if (pThis != )
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...
谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket的更多相关文章
- 服务端套接字类CxServerSocket的使用
服务端套接字类CxServerSocket的使用 这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣能),个人习惯而已,如有雷同,纯属巧合. CxS ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...
- 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket
这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...
- 谢欣伦 - OpenDev原创教程 - 串口类CxSerial
这是一个精练的串口类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. 串口类CxSerial的使用如下(以某个叫做CSomeClass ...
- 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket
这是一个精练的客户端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxClientSocket的使用如下(以某个叫做CSo ...
- 谢欣伦 - OpenDev原创教程 - 网络设备查找类CxNetworkHostFind & CxNetworkAdapterFind
这是一个精练的网络设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxNetworkHostFind的使用如下: void ...
- 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind
这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...
随机推荐
- Spring + Jedis集成Redis(集群redis数据库)
前段时间说过单例redis数据库的方法,但是生成环境一般不会使用,基本上都是集群redis数据库,所以这里说说集群redis的代码. 1.pom.xml引入jar <!--Redis--> ...
- MySql导出数据到csv
通过mysql客户端shell连接到服务器,选择使用的数据库,输入sql代码: select * from test_info into outfile '/tmp/test.csv' fields ...
- R3.2.2安装
- NetBeans无法使用编码GBK安全打开文件
刚才使用NetBeans打开php文件时,提示:NetBeans无法使用编码GBK安全地打开该路径下的文件. 找到了解决方案. 原文地址:http://qdjinxin.iteye.com/blog/ ...
- Duilib源码分析(四)绘制管理器—CPaintManagerUI—(前期准备二)
接下来,我们继续分析UIlib.h文件中余下的文件,当然部分文件可能顺序错开分析,这样便于从简单到复杂的整个过程的里面,而避免一开始就出现各种不理解的地方. 1. UIManager.h:UI管理器, ...
- [Git] 还原Git上commit,但是没有push代码
直接在Idea上操作2步解决: 1. 找到: 2. 在To Commit里面填写:HEAD^,表示将commit的信息还原为上一次的,需要多次直接reset多次即可: 使用命令行:原理一样 以下内容转 ...
- TDD学习笔记【四】--- 如何隔离相依性 - 基本的可测试性
前言 相信许多读者都听过「可测试性」,甚至被它搞的要死要活的,还觉得根本是莫名其妙,徒劳无功.今天这篇文章,主要要讲的是对象的相依性,以及对象之间直接相依,会带来什么问题.为了避免发生因相依性而导致设 ...
- 7 Container With Most Water_Leetcode
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). ...
- vmware 中ubuntu客户机 安装vmware tool vmhgfs 共享文件夹失败处理
vmware版本:10.0.0 build-1295980 ubuntu版本:3.13.0-62-generic 先安装的vmware workstation自带光盘中vmare tools包,安装完 ...
- MOD
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2318 ///这是哈理工校 ...