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

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

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

CxUdpSocket m_usRemoteHost;

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

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::BindToLocalHost()
{
if (m_usRemoteHost.IsBinded())
m_usRemoteHost.Disbind(); BOOL bRet = m_usRemoteHost.Bind(m_nUdpPort); CString str;
if (!bRet)
str.Format("Bind to %d failed. err code [%d].\n", m_nUdpPort,
CxSocket::WSAGetLastError());
else
str.Format("Bind to %d succeed.\n", m_nUdpPort);
OutputDebugString(str); return bRet;
}

四、处理消息响应或函数回调。
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::OnSocketRead(WPARAM wParam)
{
if (m_usRemoteHost.GetSocket() == (SOCKET)wParam)
{
SOME_DATA_STRUCT data = {};
char szIPAddr[MAX_IPV6] = {'\0'};
if (m_usRemoteHost.RecvFrom(szIPAddr, (LPBYTE)&data, sizeof(data)))
{
    //do something with data;
     }
}
}

2.回调函数

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

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

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

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

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. 如何给Apache添加虚拟路径和虚拟主机?

    在本地开发,一般只用一个Apache服务器,然后通过配置文件实现多个站点访问,要么是“虚拟路径(别名)”的形式,要么是“虚拟主机”的形式,相关配置参考如下: 说明:我给Apache设置的端口为:,即  ...

  2. IIS连接数、IIS并发连接数、IIS最大并发工作线程数、应用程序池的队列长度、应用程序池的

    IIS连接数 一般购买过虚拟主机的朋友都熟悉购买时,会限制IIS连接数,这边先从普通不懂代码用户角度理解IIS连接数 顾名思义即为IIS服务器可以同时容纳客户请求的最高连接数,准确的说应该叫" ...

  3. (原)android的alertdialog中加入edittext但是不弹出软键盘等问题的解决与原因

    摘要:alertdialog中加入edittext但是不弹出软键盘等问题网上有很多不管用的解决方案, 本文意在给出更有效的解决办法,并初步探究其原因 正文 在对话框中插入文本框是十分常见的需求 通常我 ...

  4. Linux ftp访问控制配置,包括访问ftp权限和访问ftp目录权限

    在Linux 上建立用户为website1 home目录是/data/home/website1 但是用ftp登录以后,路径可以随便切换,并且可以进入别的站点下 进行增.删.改 本篇的目的是:在lin ...

  5. DES & 3DES 加密算法

    JAVA坑 跟其他公司java的对接口,一个细节对到吐血,具体: DesUtil.java(别人的反例) //package base_class; import java.io.IOExceptio ...

  6. PHP PDO的FETCH_NUM、FETCH_BOTH、FETCH_ASSOC

    不容易混淆的有:FETCH_CLASS,FETCH_COLUMN,FETCH_OBJ... 数据库的连接准备部分 $dsn = 'mysql:host=127.0.0.1;port=3306;dbna ...

  7. 文本框value联动修改

    <input id="ipt-edit" value="" /><input id="ipt-target" value= ...

  8. WEB API异常处理

    当一个web api抛出一个异常后 此异常会被转化成一个HTTP响应 错误代码为500的服务错误 但是如果你不想让客户端看到500的错误码 你也可以自定义错误码 如下代码当用户输入的ID没有与之相关的 ...

  9. java 跨域

    jsonp做前端跨域需要服务器的支持的,造成json字符串前缀 var a=...或者 a[].... 实在有点麻烦,故还是后台跨域取数据好了 package com.pro.domain; impo ...

  10. SQL实现表名更改,列名更改,约束更改

    修改表名 格式:sp_rename tablename,newtablename sp_rename tablename,newtablename 修改字段名 格式:sp_rename 'tablen ...