资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Linux高级程序设计(第2版)Linux高级程序设计(第二版)人民邮电出版社 出版杨宗德 编著2009年9月Date1人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)第12章 Linux socket网络编程基 础 1 12 2网络通信基础 BSD Socket TCP网络通信编程3 3BSD Socket UDP网络通信编程4 4使用TCP实现简单聊天程序Date2人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)OSI模型及TCP/IP协议模式 Date3人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)TCP/IP体系结构及各层协议 Date4人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)IP地址分类 Date5人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)IP地址划分 类别前8位(二进制 )点分十进制第一字节范 围默认子网掩码广播地址网络数A0XXXXXXX1126(127为回环地址 )255.0.0.0X.255.255.25 5126B10XXXXXX128191255.255.0.0X.X.255.25516384C110XXXXX192223255.255.255.0X.X.X.2552097152D1110XXXX224239N/AN/AN/AE1111XXXX240254N/AN/AN/ADate6人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)网络数据包封包与拆包过程 Date7人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)数据包接收拆包分类流程 Date8人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)以太网链路层数据帧格式 Date9人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)IP数据包头 Date10人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)TCP包头 Date11人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)UDP数据包头 Date12人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)第12章 Linux socket网络编程基 础 1 12 2网络通信基础 BSD Socket TCP网络通信编程3 3BSD Socket UDP网络通信编程4 4使用TCP实现简单聊天程序Date13人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)类比电话通信,面向连接的socket通信实现 Date14人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)通信过程首先,服务器端需要做以下准备工作: (1)调用socket()函数。建立socket对象,指定通信协议。 (2)调用bind()函数。将创建的socket对象与当前主机的某一个IP地和端口绑定。 (3)调用listen()函数。使socket对象处于监听状态,并设置监听队列大小。 客户端需要做以下准备工作: (1)调用socket()函数。建立socket()对象,指定相同通信协议。 (2)应用程序可以显式的调用bind()函数为其绑定IP地址和端口,当然,也可以将 这工作交给TCP/IP协议栈。 接着建立通信连接: (1)客户端调用connect()函数。向服务器端发出连接请求。 (2)服务端监听到该请求,调用accept()函数接受请求,从而建立连接,并返回一 个新的socket文件描述符专门处理该连接。 然后通信双方发送/接收数据: (1)服务器端调用write()或send()函数发送数据,客户端调用read()或者recv()函数 接收数据。反之客户端发送数据,服务器端接收数据。 (2)通信完成后,通信双方都需要调用close()或者shutdown()函数关闭socket对象 。 Date15人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API socketDate16人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)Socket参数说明 第一个参数用来指明此socket对象所使用的地址簇或协议簇.Date17人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)Socket参数说明第二个参数为socket的类型。 Date18人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API bind完成此步,该socket拥有了本地IP地址,端口,通信协议,不 能接收客户端的请求,但可以向服务器发起连接。Date19人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)Bind参数说明第二个参数是一个指向sockaddr结构的指针。 struct sockaddr 只是提供地址类型规范,根据不同的应用,sockaddr需要选用 不同的类型。Date20人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)地址结构体定义- UNIX域套接字 Date21人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)地址结构体定义- IPV4 Date22人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)端口与IP地址Date23人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API listen第一个参数是绑定了IP及端口信息的socket文件描述符。 第二个参数为请求排队的最大长度。当有多个客户端程序和服 务器端相连时, 此值表示可以使用的处于等待的队列长度。listen 函数将绑定的socket文件描述符变为监听套接字,完成 此步: 服务器已经准备接收客户端连接请求了。Date24人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API 客户端发起连接 connect其第一个参数为socket返回的文件描述符。 第二个参数储存了服务器端的地址(包括服务器的IP地址和端口信 息)。 第三个参数为该地址的长度。如果执行成功,此函数将与地址为addr的服务器建立连接,并返回0 ,如果失败则返回-1。 正确完成此步:客户端socket拥有了目的IP,端口信息。Date25人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API 服务器接收连接 accept 第一个参数是监听网络后的socket文件描述符。 第二参数为struct sockaddr 类型的地址空间首地址,第三个参数为该段地址空 间长度,因此第二个参数用来存储客户端的IP地址和端口信息,以便为客户端 返回数据。需要注意的是,如果执行成功,此函数将返回一个新的文件描述符以标识该连 接,从而使原来的文件描述符可以继续等待新的连接,这样便可以实现多客户 端。如果执行失败,将返回-1。至此,两端的连接已经建立,而服务器端又是如何区别多个连接的呢?Date26人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)如何区分多个客户端对于任何一个TCP连接,最重要的信息包括源IP:源端口,目 的IP:目的端口四个信息。例如,客户机192.168.0.10/24的 3000、4000两端口同时向服务器192.168.0.100/24的80端口 发起两个连接,在服务器端是如何区别两个连接的呢?Date27人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API 读/写socket Date28人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API send/recv第一个参数为发送的目标socket对象; 第二个参数为欲发送的数据位置; 第三个参数为数据的大小; 第四个参数操作flags,支持的值为0或MSG_OOB(发送带外数据) 等。对套接字调用write()的行为与将flags设置为0的send()的行为完 全相同。 如果执行成功,此函数将返回发送数据的大小,如果失败,将返回-1 。Date29人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API 关闭socket对象 close/shutdownhowto=0 这个时候系统会关闭读通道,但是可以继续往socket描述 符中写。 howto=1 关闭写通道,和上面相反,此时只可以读。 howto=2 关闭读写通道,和close一样,在多进程程序里,当几个 子进程共享一个套接字时,如果使用shutdown,那么所有的子进程 都将不能操作,这时只能使用close()函数来关闭子进程的套接字描 述符。Date30人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)第12章 Linux socket网络编程基 础 1 12 2网络通信基础 BSD Socket TCP网络通信编程3 3BSD Socket UDP网络通信编程4 4使用TCP实现简单聊天程序Date31人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)面向无连接通信模型 Date32人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API sendto/ recvfrom 第一个参数为发送的目标socket对象。 第二个参数为欲发送的数据信息。 第三个参数为发送数据的大小。 第四个参数为flags,如send函数所示。 第五个参数欲发送数据的目标地址,其结构体前面已经介绍。 第六个参数为此结构体的大小。Date33人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)BSD Socket网络编程API getsockname / getpeername获得一个套接字(这个套接口至少完成了绑定本地IP地址)的本地地址。如果成功则返回0 ,如果发生错误则返回-1。 第1个参数为欲读取信息的socket文件描述符 第2,3个参数分别为存储地址的内存空间地址和大小。getpeername()函数将取得一个已经连接上的套接字的远程信息(比如IP 地址和端口)。 Date34人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)应用示例使用 AF_UNIX实现本机数据流通信示例 见代码使用AF_INET实现UDP点对点通信示例 见代码Date35人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)第12章 Linux socket网络编程基 础 1 12 2网络通信基础 BSD Socket TCP网络通信编程3 3BSD Socket UDP网络通信编程4 4使用TCP实现简单聊天程序Date36人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)服务端运行结果(IP地址为192.168.0.93) Date37人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)客户机运行结果(IP地址为192.168.0.133) 此程序只实现一端到端的数据传递,且只能一发一收的方式 。 具体见代码分析。Date38人民邮电出版社出版 杨宗德编著Linux高级程序设计(第2版)习题(1)七层模型与TCP/IP协议模型比较,各层完成的基本功能,对 应的各层最主要功能是什么? (2)写出你所知道的网络设备、网络协议其简单工作原理描述,并 列出其工作在TCP/IP协议栈的哪一层。 (3)试写出网络数据的封包与拆包过程。并分析说明TCP、IP、 UDP数据包头信息。 (4)IP地址的如何区分,A、B、C类地址范围,哪些地址是私有地 址,能够实现子网合并和拆分。子网掩码是什么,怎样计算一台 主机的网络ID和主机ID。将192.168.0.1/24网段划分成8个子网, 写出网络ID,主机ID
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号