Windows sockets 网络编程(3) — 非阻塞模式开发

一、套接字的非阻塞模式

       套接字的非阻塞模式是指套接字在执行操作时,调用的函数不管操作是否完成都会立即返回的工作模式。根据其返回的错误代码,确定操作是否正确完成。

二、设置套接字的非阻塞模式

       在使用socket()和WSASocket()函数创建套接字时,默认都是阻塞模式的。在创建套接字之后,可以通过调用ioctlsocket()函数,将套接字设置为非阻塞模式。

       int ioctlsocket(SOCKET s, long cmd, u_long FAR *argp);

       s套接字

       cmd在套接字s上执行的命令。使用FIONBIO将套接字设为非阻塞模式

      argp指向一个参数的指针。当使用FIONBIO时设置为非零值。

       例如: unsigned long ul = 1;
                   int retval = ioctlsocket( s, FIONBIO, (unsigned long *)&ul);
                   if( retval == SOCKET_ERROR)
                   {
                             //失败处理
                   }

三、优势和不足

        优势:在控制建立的多个连接、收发量不均、时间不定等方面相比阻塞模式具有明显优势。

       不足:1. 不停地检查返回代码,浪费系统资源;
                  2. 相比阻塞模式,需要编写更多的代码,使用较复杂。

四、实例(远程算术运算程序)

       采用C/S模型,基于TCP协议。

       1. 需求分析

           客户端向服务器发送算术表达式,服务器在接收到表达式之后进行计算,然后将结果返回给客户端。

           如果客户端不再要求服务器提供计算服务,则向服务器发送"bye”或"BYE”,服务器接收到之后以"OK"进行响应,然后客户端接收到响应之后关闭与服务器的连接并退出。

       2. 数据包设计

           数据包分为包头和包体,包头用于标识数据类型和指明数据包长度,包体则承载数据。

           因为服务器和客户端之间传递的数据有算术表达式和消息,所以数据类型字段包括两种类型:算术表达式和消息。数据包长度字段用于接收方判断包头和包体界限,以及接收数据长度。

       3. 服务器设计

          (1)全局变量声明

          (2)主线程main函数

          (3)初始化服务器

          (4)启动服务器

          (5)接受客户端连接线程函数

          (6)资源清理线程函数


          
          (7)停止服务器

          (8)退出服务器

          (9)CClient类

          (10)客户端开始运行StartRunning()函数

          (11)CClient类接收数据线程函数

          (12)CClient类数据处理函数

          (13)CClient类发送数据线程函数

          (14)CClient类析构函数

      4. 客户端设计

          (1)全局变量声明

          (2)主线程main函数

          (3)初始化客户端





          (4)输入表达式检验及封装数据包

          (5)发送数据线程

          (6)接收数据线程

          (7)客户端退出

      5. 运行结果



 

 

【本文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值