《windows网络编程》 8.1 8.2笔记
概况
一:Socket套接字模式
1:锁定(阻塞)模式
优点:操作简单
缺点:为了与建立连接的套接字通信 必须为每个套接字分配一个线程
虽然可行,但开销极大,拓展性极差,以后想同时处理大量套接
字时,难以下手
2:非锁定(非阻塞)模式
缺点:稍有难度
优点:排除困难后,功能强大,
套接字创建之后默认为锁定模式 可通过如下方式修改为非锁定模式
if ( ioctlsocket(m_ServerSocket,FIONBIO,&uSocketIoMode) == SOCKET_ERROR )
...
二:套接字I/0模型
1:Select模型
2:WSAAsyncSelect模型
3:WSAEventSelect模型
4:重叠模型
5:完成端口模型
三:I/0模型的选择 -->一下为windows网络编程的建议
针对服务器和客户机建议如下
1:若开发一个客户机应用,令其同时管理一个或多个套接字,建议采用重叠I/0或WSAEventSelect模型(性能)
2:若依Windows为基础的应用程序,要进行窗口消息处理,那么WSAAsyncSelect模型是最好的选择
理由:因为 WSAAsyncSelect 本身便是从Windows消息模型借鉴来的。若采用这种模型,一开始
便具备了处理消息的能力
A:客户机开发
B:服务器开发
1:要在一个给定的时间,同时控制几个套接字,建议采用重叠I/0模型,从性能出发点考虑的
2:任何给定的时间,都会为大量I/0请求提供服务,便应考虑使用I/0完成端口模型,获得更好的性能
其他小结
关于FD_WRITE
1调用connect或WSAConnect,一个套接字首次建立了连接
2:使用accept 或WSAAccept,套接字被接受以后
3:若send,WSASend,sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误,而且缓冲区的空间变得可用
只有如上三种情况FD_WRITE通知才会到达
关于WSAEWOULDBLOCK错误
在非阻塞模式下 Winsock API调用会理解返回 大多数情况下 这些调用都会"失败",并返回
一个WSAEWOULDBLOCK错误,意思就是 请求的操作在调用期间没有时间完成,举例如下
假如在系统的输入缓冲区中,尚不存在"需要解决"的数据,那么recv调用就会返回该错误
总结如下
关于shutdown
我的理解是
1 WSAAsyncSelect应该注册FD_CLOSE事件
2 然后客户端FD_CLOSE事件中调用shutdown(XX,SD_SEND);不在向服务端发送数据 然后紧接closetsocket(socket)
3 在服务端处理数据知道返回0或者返回错误SOCKET_ERROR就退出接收
4 服务端 closetsocket(socket)
如《TCP-IP详解.卷二:实现》中的一张图如下