《windows网络编程》--->套接字(I/O)模式 介绍及其选择

《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详解.卷二:实现》中的一张图如下

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值