这是一个精练的服务端套接字类,类名、函数名和变量名均采用匈牙利命名法。小写的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...

最新文章

  1. JS函数声明的问题
  2. WinformWPF 多线程访问控件【转】
  3. C语言中计算变量占用内存空间
  4. 循序渐进Python3(三) -- 0 -- 初识函数
  5. java截取字符串中的数字
  6. OpenGL ES 着色语言
  7. 为移动Web应用创建快速响应按钮
  8. Apache2.2+php5.4在windows上配置实例
  9. 转载:js实现上传图片时 点击浏览后 就可以看到缩略图 很实用
  10. ios即时通讯客户端开发之-mac上基于XMPP的聊天客户端开发环境搭建
  11. 数据访问层的改进以及测试DOM的发布
  12. .Net大局观(2).NET Core 2.0 特性介绍和使用指南
  13. HTML,CSS,JS之间的关系
  14. View学习(四)-View的绘制(draw)过程
  15. Visual studio 编辑combobox程序卡死的问题
  16. asp.net mvc各种传值方式大全
  17. logical_backup: expdp/impdp
  18. Python内置的urllib模块不支持https协议的解决办法
  19. SQL定义变量
  20. [蓝桥杯]ALGO-92.算法训练_前缀表达式

热门文章

  1. 利用html5、websocket和opencv实现人脸检测
  2. webservices接口 file "/axis2-web/listsingleservice.jsp" not found 问题解决
  3. ExtJS基础知识总结:自定义日历和ComboBox控件(二)
  4. 3 3Sum closest_Leetcode
  5. maven权威指南学习笔记(三)——一个简单的maven项目
  6. 微信开发笔记:获取用户openid,以及用户头像昵称等信息
  7. 浩瀚科技 定制现场无线手持打印PDA手持终端扫描条码开单解决方案
  8. PDA手持终端扫描条码开单打印一体 结合后台电脑系统 数据同步交互解决方案
  9. linux查看是什么操作系统是什么命令
  10. nodejs之主机不能访问到虚拟机的web服务器