你的位置:首页 > 软件开发 > 操作系统 > (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

发布时间:2016-08-03 10:00:13
.....目录(一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO(二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO(三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录(四) 一起学 Unix 环境高级编程 (APUE) 之 系统数 ...

(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

.

.

.

.

.

目录

(一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

(二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO

(三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

(四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息

(五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

(六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

(七) 一起学 Unix 环境高级编程 (APUE) 之 进程关系 和 守护进程

(八) 一起学 Unix 环境高级编程 (APUE) 之 信号

(九) 一起学 Unix 环境高级编程 (APUE) 之 线程

(十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制

(十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO

(十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

 

 

在前面的博文中我们讨论了进程间通讯(IPC)的各种常用手段,但是那些手段都是指通讯双方在同一台机器上的情况。在现实生活中我们会经常接触到各种各样的网络应用程序,比如大家经常使用的 ftpsvn、甚至QQ、迅雷等等,它们的通讯双方通常都是在不同的机器上的,那么它们的通讯就是跨主机的进程间通讯了,所以网络通讯也是一种进程间通讯的手段。

跨主机的程序在传输数据之前要制定严谨的协议,不然对方可能会看不懂你发送的数据,从而导致数据传送失败,甚至造成安全类bug,所以跨主机的通讯就不像我们之前学习的在同一台主机上的进程间通讯那么简单了。

制定协议要考虑的问题至少包括以下几点:

1)告诉对方自己的 IP 和端口;

先来看看 IP 和端口的概念。

当我们的程序在进行网络通讯之前,需要先与自己的机器进行约定,告诉操作系统我需要使用哪个端口,这样操作系统的某个端口在收到数据的时候就会发送给我们的进程。当另一个程序也来通知操作系统它要使用这个端口时,操作系统要保证这个端口只有我们使用而不能再让别人使用,否则当它收到数据的时候就不知道应该发送给谁了。

当我们需要发送数据的时候,也会使用这个端口进行发送,只有特殊情况才会使用别的端口或者使用多个端口。

 

2)还要考虑的问题是通信的双方应该采用什么数据类型呢?

假如通讯双方要传送一个 int 类型的数据,那么对方机器上 int 类型的位数与我们机器上的位数是否相同呢?

也就是说 int 类型在我的机器上是 32bit,但是在对方的机器上也是 32bit 吗?假设在对方机器上是 16bit,那么我发送给它的 int 值它能正确解析吗?

所以通信双方的数据类型要采用完全一致的约定,这个我们在下面会讨论如何让数据类型一致。

 

3)还要考虑字节序问题,这个说的是大小端的问题。

大端格式是:低地址存放高位数据,高地址存放低位数据。

小端格式是:低地址存放低位数据,高地址存放高位数据。

(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

图1 大小端

如图1 所示,假设要存放的数据是 0x30313233,那么 33 是低位,30 是高位,在大端存储格式中,30 存放在低位,33 存放在高位;而在小端存储格式中,33 存放在低位,30 存放在高位。

这个东西有什么作用呢?它其实就是我们使用的网络设备(计算机、平板电脑、智能手机等等)在内存当中存储数据的格式。所以如果通讯双方的设备存储数据的格式不同,那么一端发送过去的数据,另一端是无法正确解析的,这可怎么办呢?

没关系,还好系统为我们准备了一组函数可以帮我们实现字节序转换,我们可以像使用公式一样使用它们。

 1 htonl, htons, ntohl, ntohs - convert values between host and network byte order 2  3 #include <arpa/inet.h> 4  5 uint32_t htonl(uint32_t hostlong); 6  7 uint16_t htons(uint16_t hostshort); 8  9 uint32_t ntohl(uint32_t netlong);10 11 uint16_t ntohs(uint16_t netshort);

原标题:(十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

关键词:网络

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。