socket编程总结
大小端问题
计算机硬件有两种储存数据的方式:大端模式(big endian)和小端模式(little endian)。
- 大端模式:高位字节在前,低位字节在后。
- 小端模式:低位字节在前,高位字节在后。
例如:0x01234567的大端字节序和小端字节序的写法如下图
计算机的存储模式,与CPU设计有关,数据的顺序是由cpu决定的,如Intelx86结构采用小端模式,IBM power PC结构采用大端模式。
由于这个原因不同体系结构的机器之间进行通信时要转换成一种约定的数序,也就是网络字节顺序, 网络字节顺序采用大端模式 。
网络字节顺序与本地字节顺序之间的转换函数:
htonl()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
同步,异步,阻塞,非阻塞
同步与异步
同步和异步关注的是消息通信机制。
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以可能没有及时返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
通知调用者的三种方式,具体如下:
状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数。
阻塞与非阻塞
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
socket中read、write返回值
write
阻塞与非阻塞write返回值没有区分,都是 <0:出错,=0:连接关闭,>0发送数据大小,
特别:非阻塞模式下返回值 <0时并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的, 继续发送。
只是阻塞模式下write会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着 write,因此需要循环发送。
read
阻塞与非阻塞read返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,
特别:非阻塞模式下返回 值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收。
只是阻塞模式下read会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取。
注意:EAGAIN or EWOULDBLOCK:通常是non-blocking IO的时候才会发生(普通文件不能做non-blocking), 可以认为两者等价。
EINTR:被signal打断(不是被中断打断)。
本文地址:https://blog.csdn.net/qq_18998145/article/details/107317336
上一篇: 二、MQTT协议的了解