本文并非解释什么是非阻塞socket,也不是介绍socket API的用法, 取而代替的是让你感受实际工作中的代码编写。虽然很简陋,但你可以通过man手册与其它资源非富你的代码。请注意本教程所说的主题,如果细说,内容可以达到一本书内容,你会发现本教程很有用。
本教程内容如下:
1. 改变一个阻塞的socket为非阻塞模式。
2. select模型
3. FD宏
4. 读写函数
5. 写一个非阻塞socket代码片
6.整个代码
7.下一步
如果你在此有许多问题,那么恭喜你,在初级阶段,任何人都没有剥夺你发现问题的权利。关于你所发现的问题,请不要犹豫email我。
你可以自由发表本教程到任何WWW或FTP网部,但无论如何也要保持原教程的原型。这样我将会非常感谢你。
1.改变一个阻塞的socket为非阻塞模式
简单的几行代码就可以创建一个socket 并连接,看起来如此简单。(你可以自己加入错误处理)
有很多种方法可以设置socket为非阻塞模式, 我在unix下常用的方法如下:
到现在为此, 这个socket已为非阻塞模式了,我们可以把焦点放在如何用它了。 但是在接着写代码之前,我们要看看我们将要用到的命令。
2.选择模型
select这个方法用来检测一个socket是否有数据到来或是是否有准备好的数据要发送。声明如下:
s socket的句柄
read_flags 读描述字集合。检查socket上是否有数据可读。
write_flags 写描述字集合。检查socket上是否已有数据可发送。
exec_flags 错误描述字集合。(本教程这儿不介绍)
timer 等待某个条件为真时超时时间。
在本教程中,我们将如下用:
exec_flags参数设为null,因为在我们的程序中我们不需要关心exec事件。(解释它,超出了本教程的范围)
3.FD宏
在select方法中的描述字集合是用来检测socket上发生的读取事件的,它用法如下:
如何用,我们在后面的代码中展示。
4.读取方法
你应知道如何用下面的两个方法,但是在非阻塞模式下,它们的用法有一点点不同。
当一个socket用非阻塞模式时,当调用这两个方法的时候,它们将立即返回,比如,如果没有数据的时候,它们将不会阻塞等待数据,而是返回一个错误。从现在开始,我们就要看代码了。
5.写一个非阻塞socket代码片
首先声明要用到的变量:
我们程序运行的大部份时间都花费在不断调用select(它将花费我们大部份CPU时间),至到有数据准备好读或取。此时,timer就体现了它的意义。它决定select将等待多久。下面就是用法,请仔细分析:
补充:请确保只有在你有数据发送的情况下才设置write_flag这个描述字集合,因为socket一量创建总是可写的。也就是说,如果你设置了这个参数,select将不会等待,而是马上返回并一直循环,它将抢占CPU99%的利用率,这是不允许的。
6.整个代码
最后利用我们所学,写一个简单的客户端。当然用非阻塞模式写一个客户端有点大采小用,这儿我们只是为了展示用法。更多示例请看第7节内容。
7.下一步
其它更多的示例代码从此教程中分离,以zip文件的方式给出。为了更好的理解所学, 你最好参考一些结构更复杂,技术更强的代码:
http://users.cybernex.net.au/jj/sock.zip
分享到:
相关推荐
Linux下基于C/C++的Socket的阻塞和异步编程实例
主要介绍了Linux UDP socket 设置为的非阻塞模式与阻塞模式区别的相关资料,需要的朋友可以参考下
linux客户端Socket非阻塞connect编程[归纳].pdf
linux系统下的非阻塞套接字编程的客户端实现
linux客户端Socket非阻塞connect编程收集.pdf
linux系统下的非阻塞套接字的服务端实现,使用函数fcntl更改套接字为非阻塞,使用select函数和fd宏轮询描述符集,使用stl list管理客户端连接
linux socket编程server和多client连接c++代码;select非阻塞监听;可直接运行./tcp-server和./tcp-client测试;移植性好;
如下图所则通过源码可知,由于是AF_INET(PF_INET),所以net_families[PF_INET].create=inet_create(以后我们都
2021年Linux下socket设置为非阻塞方式和fcntl系统调用之令狐采学创编.docx
linux非堵塞socket tcp编程
I/O阻塞与非阻塞操作应用 socket多路复用技术socket信号驱动UDP广播与组播通信
使用面向连接的流式套接字,采用非阻塞的工作机制,程序只要调用这些函数查询网络消息并作出相 应的响应即可。这些函数包括: InitSocketsStruct:初始化 socket 结构,获取服务端口号。客户程序使用。 InitPassiveSock:...
socket linux 服务端 多客户非阻塞
可是使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件...
1. 线程池 + 非阻塞 socket + epoll + 事件处理的并发模型 2. 状态机解析HTTP请求 3. 心跳机制 4. 简易日志系统 主要内容: 1. 使用 socket 实现服务器和浏览器客户端的通信; 2. 用 epoll 事件检测技术实现 IO 多...
Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞
从linux源码看socket的阻塞和非阻塞 ps: 对于IO多路复用,epoll机制是linux独有的,其他类unix系统(macOS、FreeBSD、OpenBSD、NetBSD)使用的是kqueue,但是SUNOS系列使用的是event ports(即evports)。 IOCP是...
网络通信模型:Linux支持多种网络通信模型,包括阻塞式和非阻塞式通信、多路复用、信号驱动等。需要了解不同的通信模型的优缺点和使用方式。 网络编程库:Linux下有多种网络编程库,包括libnet、libpcap等。这些库...
Socket简介 Windows Socket Linux Socket Socket常用函数介绍 TCP/IP网络程序框架与实例 通信方式 阻塞 非阻塞