2024年4月28日发(作者:)
WINCE下SOCKET编程
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开始,依次递增。
发布评论