服务端套接字类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的使用的更多相关文章

  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. android USB OTG功能实现

    一个.检查HW概要,确认是否支持OTG特征(vbus无论是动力,IDDIG pin连接是否正确) 两.如果HW确认支持OTG特征,然后根据以下方法被打开USB OTG功能及实现山: 如何打开USB O ...

  2. Swift语言指南(五)--数字字面量和数字类型转换

    原文:Swift语言指南(五)--数字字面量和数字类型转换 数字字面量 整数字面量写法如下: · 十进制数,无前缀 · 二进制数,以 0b 为前缀 · 八进制数,以 0o 为前缀 · 十六进制数,以 ...

  3. Excel 创建31 个 工作表

    Sub AddSheets() Dim i As Integer Dim DaysInt As Integer Dim NameStr As String DaysInt = DateAdd(, No ...

  4. UIApplicationMain方法介绍

    在IOS程序的main函数中执行了一个UIApplicationMain这个函数,下面介绍以下这个函数的作用. int UIApplicationMain(int argc, char *argv[] ...

  5. code forces 148D Bag of mice (概率DP)

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  6. 多个Storyboard切换

    - (void)showStoryboard { // 实例化MainStoryboard UIStoryboard *storyboard = [UIStoryboard storyboardWit ...

  7. getch()和getchar()之再讨论

    原文:getch()和getchar()之再讨论 在C语言的字符处理函数中,getch()和getchar()是经常让人迷惑的两个函数,他们都有一些“奇怪的”特点让初学者摸不着头脑.两个函数有很多相似 ...

  8. 解决方案命名空间“System.Web.Mvc”中不存在类型或命名空间名称“Ajax”(是否缺少程序集引用?)

    首先对System.Web.Mvc这个dll文件重新引用本地的,添加引用,搜索mvc就可以出来,选择相应的版本.如果还不能正常运行, 然后右键打开这个项目引用System.Web.Mvc, 将复制本地 ...

  9. C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题

    1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...

  10. SQL点滴2—重温sql语句中的join操作

    原文:SQL点滴2-重温sql语句中的join操作 1.join语句 Sql join语句用来合并两个或多个表中的记录.ANSI标准SQL语句中有四种JOIN:INNER,OUTER,LEFTER,R ...