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开始,依次递增。