复习
在前面的课程中,复习了互联网协议的一些知识,然后学习了Linux系统下C可以调用的一些函数及进程的一些操作内核。
随后的实验课配置了Linux的操作环境,下面就要开始Socket编程
Socket Interface
首先socket也不用过多介绍,需要了解的我们在上学期的课程中都有过了解
它用于网络间的进程通信,它提供了用户的接口,也就是我们可以直接调用方法就能实现网路间进程通信,同时这是基于CS模型的,后续会详细说明。
我们需要了解的一点是:在Linux/Unix系统中,所有的IO流都像是文件一样,我们根据文件描述符来进行调用。包括你的键盘,甚至是Socket。
Socket addr in Linux
我们可以看到有两种Socket地址,首先是这种specific,后面还有一种generic的。
先说一下两者的关系,specific地址一般会对应特定的地址族,比如IPv4,IPv6。
通用的socket地址结构体显然很不好用,比如设置与获取IP地址和端口号就需要执行繁琐的位操作。所以,Linux为各个协议族提供了specific的socket地址结构体
但是所有的specific地址在实际使用的时候都会被转化为通用的地址,总之我们在调用socket的接口的时候,使用的全部是generic addr
Internet-specific socket addr
首先注意,这个sockaddr_in指的是IPv4的(因为第四个指size的东西只有8个字节,是填不下IPv6的地址的),这种的地址结构体里面有四个东西ppt下面都有说。
Generic socket addr
这是通用的,再次注意,实际调用中都是使用通用地址。
我们可以看到 connect() bind() accept() 这些里面使用的全部是generic addr
而generic实际上就是把specific中的几个数据合起来
socket()
刚刚上面提到过
socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
int socket(int domain, int type, int protocol);
而这其中的几个参数
domain是协议族,type是socket的type,protocol是协议(也就是TCP,UDP)
注意,socket 的type和protocol并不是随意组合的,当protocol为0时,会自动选择type类型对应的默认协议。所以这张ppt中的几种socket都是固定写法
Major System Calls
之前Java学习socket的时候就过了一遍这个基本流程,其实是大同小异的
因为是CS结构,所以会有Client和Server
我们一定是先启动Server,让Sever进入监听状态
然后Client启动他的socket,绑定Server的Ip的端口后,请求与Server连接
当Server接收到请求后,就会建立一个与Client对应的Socket,然后就可以开始通信了
至于Socket的关闭,双方都可以
这些所有的流程,都会通过如下的系统函数来完成
然后关于这页ppt中的字节顺序转化需要稍微解释一下
在计算机的网络通讯的数据表示中有两种:HBO(host byte order) && NBO(network byte order)
网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储( int型数0x12345678表示为12 34 56 78),在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order): 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。这个就是我们之前课程提过的Big-endian和 Little-endian
总之,为了避免各个计算机的CPU差异,在网络通信的时候,都必须转化为NBO,那么就需要调用下图中的函数,否则会产生乱码什么的
之后的ppt就比较常规了,介绍一下这些函数的参数和用法,具体可以直接看例子,这样理解更快
下周讲完更完