﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-春暖花开-随笔分类-网络学习</title><link>http://www.cppblog.com/SpringSnow/category/8827.html</link><description>雪化了，花开了，春天来了</description><language>zh-cn</language><lastBuildDate>Wed, 26 Aug 2009 19:22:29 GMT</lastBuildDate><pubDate>Wed, 26 Aug 2009 19:22:29 GMT</pubDate><ttl>60</ttl><item><title>Connection Manager</title><link>http://www.cppblog.com/SpringSnow/archive/2009/08/26/94474.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 26 Aug 2009 09:48:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/08/26/94474.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/94474.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/08/26/94474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/94474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/94474.html</trackback:ping><description><![CDATA[<p>最近遇到了一些问题，都是关于Connection Manager的，它的一些API的运用方面的问题。主要纠结在了ConnMgrQueryDetailedStatus函数的使用上。不是很清楚这个已经存在的网络的枚举标准是什么？我应该怎么过滤掉一些无关的连接网络。<br><br>网上查阅了一些资料<br>1、<a class=headermaintitle id=ctl00___ctl00___ctl00_ctl00_bcr_bth___BlogTitle href="http://blogs.msdn.com/cenet/default.aspx" minmax_bound="true"><u><font color=#0000ff>Windows CE Networking Team WebLog</font></u></a>&nbsp;这是网络组的一个博客<br><a href="http://blogs.msdn.com/cenet/archive/tags/Author_3A00_+Adam+Dyba/default.aspx">ttp://blogs.msdn.com/cenet/archive/tags/Author_3A00_+Adam+Dyba/default.aspx</a><br><br>&nbsp;2、How Connection Manager Connects<br><a href="http://msdn.microsoft.com/en-us/magazine/dd263096.aspx">http://msdn.microsoft.com/en-us/magazine/dd263096.aspx</a><br><br>他们都对Connection Manager熟悉，但是相关的文章中并没有提及这些。<br><br>所以还在寻找中。。。</p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/94474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-08-26 17:48 <a href="http://www.cppblog.com/SpringSnow/archive/2009/08/26/94474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Widget学习</title><link>http://www.cppblog.com/SpringSnow/archive/2009/08/24/94230.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Mon, 24 Aug 2009 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/08/24/94230.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/94230.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/08/24/94230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/94230.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/94230.html</trackback:ping><description><![CDATA[<p>今天在windows mobile的博客中，看到一篇文章名为&#8220;Widget Anatomy- The Manifest&#8221;。对于widget是第二次听到，第一次是在一个招聘的要求里看到的。<br>那么什么是Widget呢？<br>google了一下，其实还是很糊涂。<br>在《Widget是什么？》中，作者说&#8220;widget"&#8221;(和RSS一样，没有中文名的Web 2.0产物）：可以是一个图像图像的部件（小插件），也可以是图形背后的一段程序，可以嵌在手机、网页和其他人机交互的界面(例如电脑桌面）上，其目的是：1）帮助用户享用各种应用程序和网络服务（Internet services），2）方便快捷；3）好玩，速度快。<br>在《什么是widget？widget是什么意思？》文中，&nbsp;&nbsp;Widget-名词—①一个小机械设备，如球形柄或者开关装置，特别是一些没有或者想不起具体名称的物品。Gadget（新奇的小玩意）：在仪器板上一排的widgets。②在用户的图形界面上，为了实现一个具体的功能（例如卷轴或者按钮）而使用的系列图形符号和程序代码。③为某项任务特定的设备或者操纵装置--通常提供包含设定模式而行为一致的常用的widgets的widget库。<br><br>感觉widget是一个很个性化的东西，或者很小，但是很方便，很好玩。可以好好学习一下。<br><br>引用：<br>1、Widget是什么？<br><a href="http://blog.vsharing.com/Grigo/A572418.html">http://blog.vsharing.com/Grigo/A572418.html</a><br>2、什么是widget？widget是什么意思？<br><a href="http://info.codepub.com/2008/06/info-19918.html">http://info.codepub.com/2008/06/info-19918.html</a><br>3、Widget Anatomy-The Manifest<br><a href="http://windowsteamblog.com/blogs/windowsphone/archive/2009/08/12/widget-anatomy-the-manifest.aspx">http://windowsteamblog.com/blogs/windowsphone/archive/2009/08/12/widget-anatomy-the-manifest.aspx</a><br>4、Mobile Widget 是什么？<br><a href="http://www.mtrend.net.cn/bbs/viewthread.php?tid=3351">http://www.mtrend.net.cn/bbs/viewthread.php?tid=3351</a><br></p>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/94230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-08-24 10:42 <a href="http://www.cppblog.com/SpringSnow/archive/2009/08/24/94230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转： IMSI前5位对应移动运营商名称的列表</title><link>http://www.cppblog.com/SpringSnow/archive/2009/08/06/92401.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 06 Aug 2009 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/08/06/92401.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/92401.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/08/06/92401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/92401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/92401.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前做了一些版本涉及到海外的一些东西, 有些没有办法测试,只要写死IMSI号码。每回翻邮件真的很痛苦，遂在网络上查了一下。还挺全的。摘自：http://blog.csdn.net/wyymaomi/archive/2009/04/19/4091396.aspx 国际移动客户识别码 IMSI International Mobile Subscriber Identification Number&...&nbsp;&nbsp;<a href='http://www.cppblog.com/SpringSnow/archive/2009/08/06/92401.html'>阅读全文</a><img src ="http://www.cppblog.com/SpringSnow/aggbug/92401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-08-06 11:41 <a href="http://www.cppblog.com/SpringSnow/archive/2009/08/06/92401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转: 异步非阻塞套接字Winsock开发网络通信程序的经典入门</title><link>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Thu, 16 Jul 2009 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/90242.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/90242.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/90242.html</trackback:ping><description><![CDATA[转: 异步非阻塞套接字Winsock开发网络通信程序的经典入门<br>摘自: <a href="http://hi.baidu.com/mcu%5Fspaces/blog/item/aee07a66ed816323ab184cdf.html">http://hi.baidu.com/mcu%5Fspaces/blog/item/aee07a66ed816323ab184cdf.html</a><br><br><font face=Tahoma size=2>对于许多初学者来说，网络通信程序的开发，普遍的一个现象就是觉得难以入手。许多概念，诸如：同步(Sync)/异步(Async)，阻塞(Block)/非阻塞(Unblock)等，初学者往往迷惑不清，只知其所以而不知起所以然。</font>
<p><font face=Tahoma size=2><br>　　<font color=#ff00ff>异步方式指的是发送方不等接收方响应，便接着发下个数据包的通信方式；而同步指发送方发出数据后，等收到接收方发回的响应，才发下一个数据包的通信方式。<br></font><br>　　阻塞套接字是指执行此套接字的网络调用时，直到成功才返回，否则一直阻塞在此网络调用上，比如调用recv()函数读取网络缓冲区中的数据，如果没有数据到达，将一直挂在recv()这个函数调用上，直到读到一些数据，此函数调用才返回；而非阻塞套接字是指执行此套接字的网络调用时，不管是否执行成功，都立即返回。比如调用recv()函数读取网络缓冲区中数据，不管是否读到数据都立即返回，而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中，异步非阻塞套接字是用的最多的。平常所说的C/S（客户端/服务器）结构的软件就是异步非阻塞模式的。<br><br>　　对于这些概念，初学者的理解也许只能似是而非，我将用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制。目的是让初学者不仅对Socket异步非阻塞的概念有个非常透彻的理解，而且也给他们提供一个用Socket开发网络通信应用程序的快速入门方法。操作系统是Windows 98（或NT4.0），开发工具是Visual C++6.0。<br><br>　　MFC提供了一个异步类CAsyncSocket，它封装了异步、非阻塞Socket的基本功能，用它做常用的网络通信软件很方便。但它屏蔽了Socket的异步、非阻塞等概念，开发人员无需了解异步、非阻塞Socket的原理和工作机制。因此，建议初学者学习编网络通信程序时，暂且不要用MFC提供的类，而先用Winsock2&nbsp;&nbsp;&nbsp;&nbsp; API，这样有助于对异步、非阻塞Socket编程机制的理解。<br><br>　　为了简单起见，服务器端和客户端的应用程序均是基于MFC的标准对话框，网络通信部分基于Winsock2 API实现。<br>　　先做服务器端应用程序。<br>　　用MFC向导做一个基于对话框的应用程序SocketSever，注意第三步中不要选上Windwos Sockets选项。在做好工程后，创建一个SeverSock，将它设置为异步非阻塞模式，并为它注册各种网络异步事件，然后与自定义的网络异步事件联系上，最后还要将它设置为监听模式。在自定义的网络异步事件的回调函数中，你可以得到各种网络异步事件，根据它们的类型，做不同的处理。下面将详细介绍如何编写相关代码。<br>　　在SocketSeverDlg.h文件的类定义之前增加如下定义：<br></font><font face=Fixedsys size=2><br>#define&nbsp;&nbsp;&nbsp;&nbsp; NETWORK_EVENT&nbsp;&nbsp;&nbsp;&nbsp; WM_USER+166&nbsp;&nbsp;&nbsp;&nbsp; file://定义网络事件<br>&nbsp;&nbsp;&nbsp;<br>SOCKET ServerSock; file://服务器端Socket<br>在类定义中增加如下定义：<br>class CSocketSeverDlg : CDialog<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCKET ClientSock[CLNT_MAX_NUM]; file://存储与客户端通信的Socket的数组</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*各种网络异步事件的处理函数*/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnClose(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file://对端Socket断开<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnSend(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file://发送网络数据包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnReceive(SOCKET CurSock); file://网络数据包到达<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnAccept(SOCKET CurSock);&nbsp;&nbsp;&nbsp;&nbsp; file://客户端连接请求</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL InitNetwork();&nbsp;&nbsp;&nbsp;&nbsp; file://初始化网络函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void OnNetEvent(WPARAM wParam, LPARAM lParam); file://异步事件回调函数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br>};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></font><font face=Arial size=2>在SocketSeverDlg.cpp文件中增加消息映射，其中OnNetEvent是异步事件回调函数名：</font><font face=Fixedsys size=2><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_MESSAGE(NETWORK_EVENT,OnNetEvent)<br></font><font face=Arial size=2>定义初始化网络函数，在SocketSeverDlg.cpp文件的OnInitDialog（）中调此函数即可。</font><font face=Fixedsys size=2><br>BOOL CSocketSeverDlg::InitNetwork()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSADATA wsaData;</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化TCP协议<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOL ret = WSAStartup(MAKEWORD(2,2), &amp;wsaData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ret != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('初始化网络协议失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建服务器端套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ServerSock == INVALID_SOCKET)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('创建套接字失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closesocket(ServerSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //绑定到本地一个端口上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockaddr_in localaddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_family = AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_port = htons(8888);&nbsp;&nbsp;&nbsp;&nbsp; //端口号不要与其他应用程序冲突<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localaddr.sin_addr.s_addr = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bind(ServerSock ,(struct sockaddr*)&amp;localaddr,sizeof(sockaddr))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = = SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('绑定地址失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closesocket(ServerSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将SeverSock设置为异步非阻塞模式，并为它注册各种网络异步事件，其中m_hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为应用程序的主对话框或主窗口的句柄<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('注册网络异步事件失败!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WSACleanup();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen(ServerSock, 5); file://设置侦听模式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return TRUE;<br>}</font></p>
<p><font face=Arial size=2>下面定义网络异步事件的回调函数</font><font face=Fixedsys size=2><br>void CSocketSeverDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用Winsock API函数，得到网络事件类型<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iEvent = WSAGETSELECTEVENT(lParam);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用Winsock API函数，得到发生此事件的客户端套接字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOCKET CurSock= (SOCKET)wParam;</font></p>
<p><font face=Fixedsys size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(iEvent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_ACCEPT:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端连接请求事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnAccept(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_CLOSE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //客户端断开事件:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnClose(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_READ:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //网络数据包到达事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnReceive(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FD_WRITE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送网络数据事件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OnSend(CurSock);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;&nbsp;&nbsp;</font><font face=Tahoma size=2><br>　　以下是发生在相应Socket上的各种网络异步事件的处理函数，其中OnAccept传进来的参数是服务器端创建的套接字，OnClose()、OnReceive()和OnSend()传进来的参数均是服务器端在接受客户端连接时新创建的用与此客户端通信的Socket。<br></font><font face=Fixedsys size=2>void CSocketSeverDlg::OnAccept(SOCKET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //接受连接请求，并保存与发起连接请求的客户端进行通信Socket<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为新的socket注册异步事件，注意没有Accept事件<br>}<br><br>void CSocketSeverDlg::OnClose(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //结束与相应的客户端的通信，释放相应资源<br>}</font></p>
<p><font face=Fixedsys size=2>void CSocketSeverDlg::OnSend(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在给客户端发数据时做相关预处理<br>}</font></p>
<p><font face=Fixedsys size=2>void CSocketSeverDlg::OnReceive(SOCET CurSock)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //读出网络缓冲区中的数据包<br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font face=Tahoma size=2><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　用同样的方法建立一个客户端应用程序。初始化网络部分，不需要将套接字设置为监听模式。注册异步事件时，没有FD_ACCEPT，但增加了FD_CONNECT事件，因此没有OnAccept()函数，但增加了OnConnect()函数。向服务器发出连接请求时，使用connect()函数，连接成功后，会响应到OnConnect()函数中。下面是OnConnect()函数的定义，传进来的参数是客户端Socket和服务器端发回来的连接是否成功的标志。<br></font><font face=Fixedsys size=2>void CSocketClntDlg::OnConnect(SOCKET CurSock, int error)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(0 = = error)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(CurSock = = ClntSock)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox('连接服务器成功!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</font><font face=Tahoma size=2><br>　　定义OnReceive()函数，处理网络数据到达事件;<br>　　定义OnSend()函数，处理发送网络数据事件;<br>　　定义OnClose()函数，处理服务器的关闭事件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　以上就是用基于Windows消息机制的异步I/O模型做服务器和客户端应用程序的基本方法。另外还可以用事件模型、重叠模型或完成端口模型，读者可以参考有关书籍。<br>　　在实现了上面的例子后，你将对Winsock编网络通信程序的机制有了一定的了解。接下来你可以进行更精彩的编程, 不仅可以在网上传输普通数据，而且还以传输语音、视频数据，你还可以自己做一个网络资源共享的服务器软件，和你的同学在实验室的局域网里可以共同分享你的成果。</font></p>
<p>&#160;</p>
<p>&#160;</p>
<p>同步服务器套接字挂起应用程序的执行，直到套接字上接收到连接请求。同步服务器套接字不适用于在操作中大量使用网络的应用程序，但它们可能适用于简单的网络应用程序。使用 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.bind(VS.80).aspx"><u><font color=#0000ff>Bind</font></u></a> 和 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(VS.80).aspx"><u><font color=#0000ff>Listen</font></u></a> 方法设置 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket(VS.80).aspx"><u><font color=#0000ff>Socket</font></u></a> 以在终结点上侦听之后，Socket 就可以随时使用 <a href="http://msdn2.microsoft.com/zh-cn/library/system.net.sockets.socket.accept(VS.80).aspx"><u><font color=#0000ff>Accept</font></u></a> 方法接受传入的连接请求了。应用程序被挂起，直到调用 Accept 方法时接收到连接请求。</p>
<div class=seeAlsoNoToggleSection>
<p>接收到连接请求时，Accept 返回一个与连接客户端关联的新 Socket 实例。下面的示例读取客户端数据，在控制台上显示该数据，然后将该数据回显到客户端。Socket 不指定任何消息协议，因此字符串&#8220;&lt;EOF&gt;&#8221;标记消息数据的结尾。它假定一个名为 <tt><font face=新宋体>listener </font></tt>的 Socket 已初始化，并绑定到一个终结点。</p>
<p>Console.WriteLine("Waiting for a connection...");<br>Socket handler = listener.Accept();<br>String data = null;</p>
<p>while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp; bytes = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp; int bytesRec = handler.Receive(bytes);<br>&nbsp;&nbsp;&nbsp;&nbsp; data += Encoding.ASCII.GetString(bytes,0,bytesRec);<br>&nbsp;&nbsp;&nbsp;&nbsp; if (data.IndexOf("&lt;EOF&gt;") &gt; -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Console.WriteLine( "Text received : {0}", data);</p>
<p>byte[] msg = Encoding.ASCII.GetBytes(data);<br>handler.Send(msg);<br>handler.Shutdown(SocketShutdown.Both);<br>handler.Close();</p>
<p>msdn官方说明:http://msdn2.microsoft.com/zh-cn/library/80z2essb(VS.80).aspx</p>
</div>
<img src ="http://www.cppblog.com/SpringSnow/aggbug/90242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2009-07-16 15:56 <a href="http://www.cppblog.com/SpringSnow/archive/2009/07/16/90242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IWebBrowser2的方法</title><link>http://www.cppblog.com/SpringSnow/archive/2008/12/03/68456.html</link><dc:creator>Sandy</dc:creator><author>Sandy</author><pubDate>Wed, 03 Dec 2008 05:34:00 GMT</pubDate><guid>http://www.cppblog.com/SpringSnow/archive/2008/12/03/68456.html</guid><wfw:comment>http://www.cppblog.com/SpringSnow/comments/68456.html</wfw:comment><comments>http://www.cppblog.com/SpringSnow/archive/2008/12/03/68456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/SpringSnow/comments/commentRss/68456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/SpringSnow/services/trackbacks/68456.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天在网上看到的．最近在弄浏览器，对其方法要熟悉一些．贴出来，以备查询．　IWebBrowser2 Interface　http://msdn.microsoft.com/en-us/library/aa752127(VS.85).aspx                                    AddressBar                  ...&nbsp;&nbsp;<a href='http://www.cppblog.com/SpringSnow/archive/2008/12/03/68456.html'>阅读全文</a><img src ="http://www.cppblog.com/SpringSnow/aggbug/68456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/SpringSnow/" target="_blank">Sandy</a> 2008-12-03 13:34 <a href="http://www.cppblog.com/SpringSnow/archive/2008/12/03/68456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>