Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 监视UDP报文的一个类
【标  题】:监视UDP报文的一个类
【关键字】:UDP
【来  源】:http://blog.csdn.net/webmote/archive/2006/09/15/1228371.aspx

监视UDP报文的一个类

Your Ad Here 目标是用winsock2完成对UDP报文的监视
UDP报文属于一种无连接的报文传送机制,所以发送速度快,如果没有报文次序的要求,应该属于一种很好的网络通讯方式。
为了实现对UDP报文的监视,我开了一个线程,专门用于等待UDP报文的到达信息,其中采用winsock I/O模型中的select异步模型-WSAEventSelect。
该模型最主要的特点是在网络事件发生时会投递一个事件对象句柄。
其中初始化winsock,注册select模型的的方法如下:
代码:
	//建立一个网络事件发生时要投递的事件对象	m_socketEvent=WSACreateEvent();	//选择异步socket模型	::WSAEventSelect(m_sock,m_socketEvent, FD_READ);		
实现监视守护线程
代码:
UINT CUdpProc::UDPListen( LPVOID pParam ){	CUdpProc* proc=(CUdpProc*)pParam;	//投递的网络事件	WSANETWORKEVENTS networkEvents;	DWORD dCount=1;	//给主线程预留的管理事件,以关闭本线程	while(::WaitForSingleObject(proc->m_event.m_hObject,300)!=WAIT_OBJECT_0)	{				if(proc->m_socketEvent==WSA_INVALID_EVENT)		{			break;		}		//阻塞UDP监听		::WSAWaitForMultipleEvents(dCount,&(proc->m_socketEvent),FALSE,WSA_INFINITE,FALSE);		//事件到达后的处理		::WSAEnumNetworkEvents(proc->m_sock,proc->m_socketEvent,&networkEvents);		if(networkEvents.lNetworkEvents & FD_READ) //如果是数据到达		{			if(networkEvents.iErrorCode[FD_READ_BIT]!=0)			{				TRACE("err code=%d\n",networkEvents.iErrorCode[FD_READ_BIT]);			}			else				proc->DoMsgRead(); //处理数据		}		//重新设置投递的事件对象		::WSAResetEvent(proc->m_socketEvent);	}	//告诉主线程,监听线程结束	proc->m_eventListenClose.SetEvent();	return 0L;}		

由于子线程大部分时间处于阻塞状态,不会响应主线程发送的事件信号,所以关闭监视子线程的方法采取如下措施:
代码:
	//等待监听线程结束的事件信号	while(::WaitForSingleObject(m_eventListenClose.m_hObject,50)!=WAIT_OBJECT_0)	{		//设置关闭线程事件		m_event.PulseEvent();		//设置激活socket事件		::WSASetEvent(m_socketEvent);		//设置取消监视事件		::WSAEventSelect(m_sock,m_socketEvent,0);	}	//释放监视事件	::WSACloseEvent(m_socketEvent);	m_event.Unlock();	m_eventListenClose.Unlock();	if(m_sock!=INVALID_SOCKET)	{		::closesocket(m_sock);		::WSACleanup();	}
启动线程的方法很简单,
代码:
BOOL CUdpProc::StartListen(){	BOOL bResult=InitSock();	AfxBeginThread(UDPListen,this);	return bResult;}
 
Builder模式实例分析(C语言版):【上一篇】
MFC几个关于字符串处理的全局函数:【下一篇】
【相关文章】
  • 通过端口映射让你的realplayer使用UDP
  • 网络管理之tcp/udp篇
  • UDP协议的WinSock API编程示例
  • P2P之UDP穿透NAT的原理与实现(ZT)
  • 用CAsyncSocket类实现TCP UDP的模型
  • 网络管理之TCP/UDP
  • UDP windows下socket编程实例
  • UDP (DNS) with keepalived?
  • About NAT Check Version 3, with UDP and TCP supp
  • UDP编程的一点小结。
  • 【随机文章】
  • 处理JNI的中文字符串
  • [转载]Debian下关闭触控板
  • 基础知识 XST攻击理论及手法讲解
  • Maya UV 编辑实例系列(18)UV编辑器
  • AI-RCJ教学建议提纲
  • 中文php.ini配置说明
  • 身为开发人员的您,准备好迎接Widows Mobile 6了吗?
  • Maya 4.0 多边形建模-编辑多边形(3)
  • 应用纪实:四班ERP在汽车零部件制造业(下)
  • 要不说你傻呢?
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.