博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket网络编程 的基本方法:--ongoing
阅读量:6464 次
发布时间:2019-06-23

本文共 1604 字,大约阅读时间需要 5 分钟。

https://blog.csdn.net/shuxiaogd/article/details/50366039
在学习网络编程时,我们总是从最简单的Server程序写起:
socket -> bind -> listen -> accept -> read -> write -> return
再接下来,就是学习如何处理客户端的并发请求。主要思路有:  
    使用多线程/多进程模型
    使用IO多路复用模型
    使用多线程 + IO多路复用模型
其中,使用IO多路复用模型,我们总是从select系统调用开始学起。但是,我们也总是听到,select效率太低了,大型项目中也从来不使用select/poll,而是使用的epoll。

那么,为什么select系统调用效率低下呢?而epoll又是作了哪方面改进,从而要高效很多呢?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

其他随笔:

记忆起了select函数的用法:

专门开辟一个线程对串口发送过来的数据进行接受,但是这个线程并不是一直不停地运行的,没有数据过来时会被阻塞在select函数,从而不占用cpu的时间!!!
(这难道就是QSocketNotifier的 原理吗!!虽然其并没有单独开辟一个线程去执行槽函数!)
另一种方式阻塞: 打开串口时,设置为阻塞的方式!------------ 这种方式与select那种更好呢?::网友的说法:
 read()函数和write()函数本身就有阻塞的功能,那么为什么还要用select呢?个人觉得用select主要有以下两个原因
    1、select可以监控多个文件描述符的状态,等相应的描述符有变化了再去读写。这时如果不用select的话,每个描述符你都要开一个进程去等待,太浪费资源了。
    2、使用select可以进行非阻塞开发。如果不想在网络包还没来之前一直阻塞在recv(),这时候就可以设置select参数timeout的值来处理了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
在Beginning linux progrmming的第637页,有关于iotcl的使用例子,可以整理一下。
ioctl 是用来设置硬件控制寄存器,或者读取硬件状态寄存器的数值之类的。而read,write 是把数据丢入缓冲区,硬件的驱动从缓冲区读取数据一个个发送或者把接收的数据送入缓冲区。
ioctl(keyFd, FIONREAD, &b)
ref :  https://blog.csdn.net/yasi_xi/article/details/8246446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
在Beginning linux progrmming的第640页,是服务器端的代码,其用了一种判断一个已经连接的client是否还在的方法:
先用select函数,如果结果是该client是可读的,然后调用ioctl(keyFd, FIONREAD, &bytes),得到可以都的字节数是几个,如果是0(这种情况是不是对应调用recv返回-1),则直接关闭这个client!
(客户端也可以用这方法判断server是否alive吧!)

转载于:https://www.cnblogs.com/butterflybay/p/10347925.html

你可能感兴趣的文章
斐波那契数列 Java 不同的实现方法所需要的时间比较
查看>>
命令行git的使用
查看>>
php的正则表达式完全手册
查看>>
Java的自动装箱和拆箱
查看>>
Appium环境准备(二)
查看>>
1111
查看>>
面试!你准备了吗?
查看>>
如何在 GitHub 建立个人主页和项目演示页面
查看>>
工厂模式
查看>>
PMI网站中pdu查询
查看>>
[USACO09OPEN]捉迷藏Hide and Seek
查看>>
$\sin x_0+\frac{\cos x_0}{1!}(x-x_0)+\cdots +\frac{\sin (x_0+n\frac{\pi}{2})}{n!}(x-x_0)^n+\cdots$
查看>>
python学习之老男孩python全栈第九期_day009之初始函数初窥
查看>>
第二次作业 随机数四则运算
查看>>
AESEncryption Aes 加密
查看>>
关于定位中left和right,top和bottom的权重问题
查看>>
分析bugreport
查看>>
腾讯UED 漂亮的提示信息
查看>>
[转]fedora亮度控制
查看>>
初始化指针
查看>>