黄页网站是什么,学做网站论坛vip,网站建设公司推广网站品牌运营,网站建设 地址 昌乐一、Windows的网络编程
其实对开发者而言#xff0c;只有Windows和其它平台。做为一种普遍流行的图形OS#xff0c;其一定会与类Linux的编程有着明显的区别#xff0c;这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架#xff0…一、Windows的网络编程
其实对开发者而言只有Windows和其它平台。做为一种普遍流行的图形OS其一定会与类Linux的编程有着明显的区别这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架而且这么多年来没有再看到有革命性的模型或者框架出现这也是在Windows上进行网络编程的一个优势。同时由于其的闭源性使得其它许多想by pass的技术只能由微软自己的主导从而导致技术进步的缓慢甚至没有推动的动力。
二、Windows常用的IO模型
在Windows平台上其通用的IO模型与前面分析的一致但在一些常用的网络IO模型上则可以分为以下几种 1、select模型 其函数接口如下
int WSAAPI select{int nfds;fd_set *readfds;fd_set *writefds;fd_set *exceptfds;const timeval *timeout;
};
此select模型和Linux平台上的select模型基本类似只是有个别参数的设置可能略有不同比如第一个参数“int nfds”在Windows平台上无意义而在Linux表示监控最大的句柄数不过不影响具体的功能。其应用场景和缺点也是小并发在高并发时效率可能会急剧降低。 2、WSAAsyncSelect模型 其函数接口定义如下
int WSAAsyncSelect([in] SOCKET s,[in] HWND hWnd,[in] u_int wMsg,[in] long lEvent
);此模型主要是为了适应Windows的消息通知机制。可能没有写过Windows编程的不知道在Windows系统上UI的通信基本都是消息方式传递的宏定义基本以WM_XXX开头。它的缺点自然也就带着消息的缺点一是消息自身的限制如队列的大小、同步非同步以及需要有UI线程等二是可能会丢失。所以其性能仍然比较低需要较为复杂的UI线程共同处理。它也不适合高并的客户端连接。
3、WSAEventSelect模型 其函数接口定义如下
int WSAAPI WSAEventSelect([in] SOCKET s,[in] WSAEVENT hEventObject,[in] long lNetworkEvents
);一般来说事件的处理都是有上限限制的毕竟事件的机制受内核限制的。所以使用此模型一个线程处理的事件上限为64个。它的优点在于支持事件编程这个在Windows上是有专门的接口的。 其它应用场景也是中低并发场景一般不宜超过百的量级。 4、重叠overlapped模型 这玩意儿其实就是异步IO的一种实现重叠就是多个IO在一起被工作。也就是常理解的IO与实际的操作分离。这样导致的结果就是可以利用多个线程的复用来管理大批的IO操作。即业务是业务IO是IO。而非是同步IO中的线程与IO同步造成线程的浪费。在Windows平台上提供了waitformultipleobjects和waitforsingleobject两个函数来处理对IO的监听。 它的优点很明显对并发量处理上去了但实际上仍然在大量线程操作大量IO操作时会产生不小的资源浪费比如到了千以上级。 它的数据结构和相关函数定义如下
typedef struct _WSAOVERLAPPED {DWORD Internal;DWORD InternalHigh;DWORD Offset;DWORD OffsetHigh;WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;
BOOL WSAAPI WSAGetOverlappedResult([in] SOCKET s,[in] LPWSAOVERLAPPED lpOverlapped,[out] LPDWORD lpcbTransfer,[in] BOOL fWait,[out] LPDWORD lpdwFlags
);5、完成端口模型IOCP 如果弄明白了上面的重叠IO就很容易理解IOCPCompletion Port。重叠IO需要人为的处理上层应用线程和下层的异步IO调度这本身就是一个非常复杂和非常有难度的问题。小数量并发时不会体现出来。不过也不会用IOCP但在大数量时这个现象就非常突出了。所以Windows自己提供了一套线程和数据队列的管理机制用来处理异步IO与上层线程池的的数据交换和管理。 它的优点非常明显可以非常好的平衡多线程和IO之间的平衡并在此过程中取得最大的优化。缺点也非常明显复杂不好调试。 下面看一下创建完成端口的函数
HANDLE WINAPI CreateIoCompletionPort(_In_ HANDLE FileHandle,_In_opt_ HANDLE ExistingCompletionPort,_In_ ULONG_PTR CompletionKey,_In_ DWORD NumberOfConcurrentThreads
);使用完成端口还需要其它函数这里不再介绍待专门写完成端口时再进行分析和说明。
值得一提的是其实上述的模型也属于IO多路复用的模型就看从什么角度来划分了。另外Windows平台上对传统的Socket进行了一系列的封装这些封装可能对初学者来说不太友好需要一个学习和适应的过程。
三、比较分析
WSAAsyncSelect和WSAEventSelect在底层的机制基本一是类似的。不同的在于得到网络通知时一个用来使用Windows的消息机制一个使用的是Windows的事件机制。很多没有在Windows上开发过的开发者可能不明白二者的不同。不过这不难用到的时候儿仔细看一下即可。 overlapped模型实际中看到的应用非常少也可能是经历比较少吧。但确实在开源的库和框架里也很罕见。它有点类似于IOCP出现前的一个半成品IOCP出现后小并发的基本前面几个模型就可以轻松应对大的基本就上IOCP了。 IOCP在高并发服务端应用还是非常广泛的它是一个纯异步IO模型即从上到下可以认为全是异步操作。这种操作等于隔离了IO操作和IO结果应用的实现。IO操作由系统实现只有和上层应用通信即IO结果应用上才会发生状态和数据上的交换。其实就是将数据对IO的投递和接收队列化。由队列做为一种通信接口来实现应用线程与异步IO操作的交互从而达到既隔离操作但又提供交互的机制。 需要说明一个问题很多初学者甚至很多开发网络编程多年的开发者都认为这些模型只用于服务端其实不是的。不管是在什么平台除非特别的约定或特定的情况下都可以用在服务端和客户端。但一般情况下由于这些模型相对来说要复杂不少客户端的功能一般也比较弱小所以大多还是使用普通的Socket编程来处理。
四、总结
在Windows平台上网络高并发的开发重点以游戏居多。其它的当然也可以做毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿精神食粮就提到了必须的日程上来。至于游戏对青少年的影响就看大环境了。 已经好多年不在Windows上进行编程了以后的网络编程重要分析也是以类Linux平台为主。