互联网应用 -- WEEK.3

复习

在前面的课程中,复习了互联网协议的一些知识,然后学习了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就比较常规了,介绍一下这些函数的参数和用法,具体可以直接看例子,这样理解更快

下周讲完更完

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值