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

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

一、声明无连接套接字对象实例。

  1. CxUdpSocket m_usRemoteHost;

二、设置无连接套接字事件通知方式。消息响应或回调函数,任选其一。无连接套接字事件有:缓冲区有数据可接收。

  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::BindToLocalHost()
  2. {
  3. if (m_usRemoteHost.IsBinded())
  4. m_usRemoteHost.Disbind();
  5.  
  6. BOOL bRet = m_usRemoteHost.Bind(m_nUdpPort);
  7.  
  8. CString str;
  9. if (!bRet)
  10. str.Format("Bind to %d failed. err code [%d].\n", m_nUdpPort,
  11. CxSocket::WSAGetLastError());
  12. else
  13. str.Format("Bind to %d succeed.\n", m_nUdpPort);
  14. OutputDebugString(str);
  15.  
  16. return bRet;
  17. }

四、处理消息响应或函数回调。
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. /////////////////////////////////////////////////////////////////////////////
    // CSomeClass message handlers

  8. LRESULT CSomeClass::OnSocketEvent(WPARAM wParam, LPARAM lParam)
  9. {
  10. if (WSAGETSELECTERROR(lParam) != )
  11. return ;
  12.  
  13. int nEvent = WSAGETSELECTEVENT(lParam);
  14. switch (nEvent)
  15. {
         case FD_ACCEPT: OnSocketAccept(wParam); break;
           case FD_CLOSE: OnSocketClose(wParam); break;
           case FD_READ: OnSocketRead(wParam); break;
         default: break;
  16. }
  17.  
  18. return ;
  19. }
  20.  
  21. void CSomeClass::OnSocketRead(WPARAM wParam)
  22. {
  23. if (m_usRemoteHost.GetSocket() == (SOCKET)wParam)
  24. {
  25. SOME_DATA_STRUCT data = {};
  26. char szIPAddr[MAX_IPV6] = {'\0'};
  27. if (m_usRemoteHost.RecvFrom(szIPAddr, (LPBYTE)&data, sizeof(data)))
  28. {
        //do something with data;
         }
  29. }
  30. }

2.回调函数

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

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

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

  至于无连接套接字数据发送,很简单,在需要处调用以下函数:

  1. m_usRemoteHost.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));

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

下载

Sample using libComm - v1.1 For WinXP

libComm - v1.2 For WinXP/Win7

谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket的更多相关文章

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

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

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

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

  3. 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia

    libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...

  4. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...

  5. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...

  6. 谢欣伦 - OpenDev原创教程 - 串口类CxSerial

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

  7. 谢欣伦 - OpenDev原创教程 - 网络设备查找类CxNetworkHostFind & CxNetworkAdapterFind

    这是一个精练的网络设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxNetworkHostFind的使用如下: void ...

  8. 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind

    这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...

  9. 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind & CxDeviceMapFind

    这是一个精练的设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxDeviceFind的使用如下: void CUsbSc ...

随机推荐

  1. 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化

    微信服务号模板消息可以向用户发送重要的服务通知,如信用卡刷卡通知,商品购买成功通知等.昨日,微信团队发布公告称模板消息新增“设置行业”和“添加模板”接口及细节优化,详细变动如下 模板消息[业务通知]自 ...

  2. MySQL 关联表批量修改(数据同步)

    update table1 t1 ,table2 t2 set t1.field1 = t2.field2 where t1.id = t2.id

  3. Linux 新建用户、用户组,给用户分配权限(chown、useradd、groupadd、userdel、usermod、passwd、groupdel)

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  4. 使用bootstrap tooltip控件动态修改提示内容

    初始化控件之后即使修改了元素的title内容也不会更改提示信息,比如下面 $(element).attr('title','XXXXXX') 这样只会增加一个原生的title提示,如果保持原样显示必须 ...

  5. touch移动触屏滑动事件

    移动端触屏滑动的效果其实就是图片轮播,在PC的页面上很好实现,绑定click和mouseover等事件来完成.但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件 ...

  6. MFC之进度条CProgressCtrl

    一.成员函数简介 1.create()针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个. 2.SetRange()设置进度条的起始值和终止值. 3.SetPos()设置进度条的当 ...

  7. phpcms手机门户相关

    相关标签 {$WAP['sitename']}标题 {list_url(3)} 调取栏目链接 {template "wap","header"}{templat ...

  8. Java类名.class和getClass()区别

    区别 类名.class叫做“类字面量”,因class是关键字, 所以类名.class编译时确定. getclass()运行时根据实际实例确定,getClass()是动态而且是final的. Strin ...

  9. Socket通信(一)

    代码及PDF下载链接:http://download.csdn.net/detail/u010312811/9683034 例程1:实现服务器与客户端的连接与简单数据收发 参考链接:http://bl ...

  10. MST 001

    一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? 答:   1.String是字符串常量,StringBuffer和StringB ...