WINCE下SOKET编程.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WINCE下SOCKET编程 SUNNY.MAN WINCE下不能使用异步CAyncSocket类,没有办法只有自己用API函数写一个相对异步的SOCKET(套接字)类来通信,把写这个类时碰到的问题写下来就成就了本文。本文描述一个客户端非阻塞SOCKET异步类的创建过程。如果你想看服务器端那么本文不太适合你。首先说明几个概念: 什么叫套接字? 所谓套接字就是一套接口的ID,你就把套接字管理程序想像成一个邮局,邮局里有许多信件,但每一个信件都要有街道+门牌,这样来才能才能把信准确的投递。同样网卡接收到许多数据,每个数据的包头都有一个IP+端口号,这样网络管理程序就可以通过这个来找到是哪个程序的数据,所以网络管理程序一定有一个结构,里面一定记录着至少IP,端口,进程ID等信息,这个东西就是套接字,但这些东西属于内核,你只能使用一个文件描述符,也就是这个结构数组的下标,也就是说当你SOCKET S=()时返回的是一个文件描述符,正是通过这个系统才知道你要使用哪个套接字。换句话说,套接字就是为了让一块网卡都好多程序使用。当然还有一些其它的服务资源,比如发送缓冲,接收缓冲等等。 接下来明确什么叫阻塞和非阻塞? 如果你不设置非阻塞模式,那么SOCKET默认的就是阻塞模式SOCKET。当SOCKET用阻塞模式工作时,当调用connect或是accept,rev,send等阻塞函数时就会一直等到函数执行完成才返回,才可以执行下一条语句。为什么需要等待呢,因为这是网络传递,需要一定时间才可能得到另一头上的回复。而非阻塞就是马上返回,不进行等待。如果你想知道刚才的执行结果,你就需要再次查看,或是等待消息通知。打个比方,如果你在阻塞模式下,connect服务器时,如果服务器不在线,那么你就得等到connect超时后(大约20~30秒),才会执行下一条语句。而非阻塞是,则马上返回执行下一条语句,如果想知道连接结果,你就得轮循查看,才知道是否连通或是超时。 再次明确什么叫同步什么叫异步? 如果你光用API函数,是没有什么同步和异步的,因为同步是相对你的主线程来说的,你所有的代码都在主线程里做,还有什么异步?只有你使用了别人用API的封装成的类才有同步和异步。当你用同步类时也就是这个类的某个成员函数要执行完成才会执行下一行代码,会等待。当是异步时就是任何一个成员函数都会马上返回。千万别把阻塞和同步弄混,一个是说套接字的使用,一个是说封装类的调用。可以用阻塞函数实现一个异步的SOCKET类。当然也可以用一个非阻塞来实在。我就是用非阻塞模式实现的异步SOCKET类。异步就是在类内部开辟新线程来执行那些阻塞函数,这样不会影响主线程的执行,当然就是异步的。同理用非阻塞也可以实现同步。 客户端SOCKET的主要使用的API函数有以下几个 1. WSAStartup和WSACleanup WSADATA wsaData; WSAStartup(MAKEWORD(2,2), wsaData); WSACleanup(); 这两个函数应该成对调用,以便释放SOCKET资源。你可以在每类的构造和析构函数里调用。当然也可以定义一个静态变量,只在第一个对象创建,和最后一个对像构析时调用。我就是采取的后者。 2. socket函数 这个用来得到一个SOCKET文件描述符,以用来操作SOCKET的资源,一般来说返回值从1开始,依次递增。 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 3. setsockopt函数 要用来设定一些参数,其中有SO_DONTLINGER、SO_LINGER、SO_RCVBUF、SO_SNDBUF等。 ingerOpt.l_onoff = 0; lingerOpt.l_linger = 0;//主要是在关闭时马上关闭,不用发送完没有发送的数据 setsockopt(s, SOL_SOCKET, SO_DONTLINGER, (char*) dontLinger, sizeof(BOOL)); setsockopt(s, SOL_SOCKET, SO_LINGER, (char*) lingerOpt, sizeof(LINGER)); 4. ioctlsocket 这个用来设置SOCKET工作在非阻塞模式下。 u_long iMode = 1; //non-blocking mode is enabled. ioctlsocket(s, FIONBIO, iMode); 5. connect 当用非阻塞模式时,调用这个函数马上返回,如果是阻塞模式,则一直等到连接完成或是超时才会返回。 connect(s, (SOCKADDR*) m_remoteAddress, s

文档评论(0)

ldj215323 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档