第9章网络通信应用_第1页
第9章网络通信应用_第2页
第9章网络通信应用_第3页
第9章网络通信应用_第4页
第9章网络通信应用_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 网络通信应用 9.1 网络通信基础 9.2 Socket通信基本概念 9.3 Socket高级应用 9.1 网络通信基础 9.1.1 TCP/IP协议族 9.1.2 IP协议 9.1.3 TCP协议 9.1.4 UDP协议 9.1.5 学习分析协议的方法 9.1.1 TCP/IP协议族 TCP/IP协议实际上是由一组协议组成的, 通常也称做TCP/IP协议簇。根据ISO/OSI 参考模型对网络协议的规定,对网络协议 划分为7层。TCP/IP协议簇可以分成4层。 9.1.2 IP协议 IP协议工作在网络层,负责数据包的传输 管理。IP协议实现两个基本功能:寻址和 分段。寻址是IP协议提供

2、的最基本功能, IP协议根据数据包头中目的地址传送数据 报文。 由于不同类型的网络之间传输的网络报文 长度是不同的,为了能适应在不同的网络 中传输TCP/IP协议报文,IP协议提供分段 机制帮助数据包穿过不同类型的网络 9.1.2 IP协议 IP协议不提供可靠地传输服务,它不提供端到 端的或(路由)节点到(路由)节点的确认, 对数据没有差错控制,它只使用报头的校验码, 不提供重发和流量控制 。如果出错可以ICMP 报告,ICMP在IP模块中实现。 目前IP协议头版本号是4,称作IPv4,下一代 IP协议版本号是6,称作IPV6。 IPV4支持232-1个地址,目前已经出现IP地址 危机。 IP

3、V6支持2128-1个地址,目前已经出现IP地址 危机。 9.1.3 TCP协议 TCP协议是一个传输层协议。TCP协议位于网 络互联层后,是IP协议的上层协议。TCP是一 个面向连接的可靠传输协议。在一个协议栈处 理程序中,如果发现数据包的IP层后携带了 TCP头,会把数据包交给TCP协议层处理。 TCP协议层处理完毕后,把其余数据交给应用 层程序处理。 9.1.4 UDP协议 UDP与TCP一样是传输层协议,但是UDP 协议没有控制数据包的顺序和出错重发机 制。因此,UDP的数据在传输时是不稳定 的。UDP另一个重要问题就是安全性不高。 由于UDP没有连接的概念,在一个数据传 输过程中,U

4、DP数据包可以很容易地被伪 造或者篡改。 9.1.5 学习分析协议的方法 学习网络协议需要一 个直观的认识,推荐 读者使用网络协议分 析的工具分析协议。 目前有很多的网络协 议分析工具,著名的 Sniffer就是一款专业 的网络协议分析利器。 本节介绍一个比较流 行的工具Ethereal。 9.2 Socket通信基本概念 9.2.1 创建socket对象 9.2.2 面向连接的Socket通信实现 9.2.3 面向连接的echo服务编程实例 9.2.4 无连接的Socket通信实现 9.2.5 无连接的时间服务编程实例 在UNIX系统中,网络应用编程界面有两类:UNIX BSD的Socket

5、和 UNIX System V的TLI 。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有了更大的发展,其网络应用编 程界面Socket在网络软件中被广泛应用,至今已引进到 Windows和VxWorks等操作系统中,成为开发网络应用软件的强 大工具。 Socket相当于网络上的通信节点,即IP地址加上端口号。应用程序 使用了Socket之后,就可以和网络上的任何一个通信节点连接。 Socket之间的通信就如同一台PC机上两个进程间的通信一样。 在Linux操作系统中,可以将Socket看成是一种设备,即一种可作 双向传输的信道,Linux程序可以经过此设

6、备与本地或是远程的程 序进行通信。 Socket常被翻译成套接字或者插口。它实际就 是网络上的通信端点,使用者或应用程序只要 连接到Socket便可以和网络上任何一个通信端 点连接、传输数据。 Socket封装了通信的细节,在Linux系统中,为 使用者提供了类似文件描述符的操作方法。 Socket分成面向连接的数据流通信和无连接的 数据报通信。 9.2.1 创建socket对象 在使用socket通信之前,需要创建socket对象。 对应用程序员来说,socket对象就是一个文件 句柄,通常使用socket()函数创建socket对象。 函数定义如下: #include #include i

7、nt socket(int domain, int type, int protocol); 9.2.2 面向连接的Socket通信实现 面向连接的数据流通信在TCP/IP协议簇是 使用TCP作为传输层协议通信,按照TCP 协议的要求,通信双方需要在传输数据前 建立连接,术语上称做“TCP的三次握 手”。对应用程序员来说,这个过程是透 明的。 9.2.2 面向连接的Socket通信实 现 9.2.3 面向连接的echo服务编程 实例 服务器端: 24 /* 创建socket */ 25 sock_fd = socket(AF_INET, SOCK_STREAM, 0); 40 /* 把地址和套

8、接字绑定 */ 41 if(bind(sock_fd, (struct sockaddr*)/ 关闭新建的连接 78 close(sock_fd);/ 关闭服务端监听的socket 目前,Internet仍使用IPv4作为寻址模式。在Socket中,寻 址模式的结构为sockadd_in,定义如下: struct sockadd_in sa_family_t sin_family; /*addressing mode*/ unsigned short int sin_port; /*port number*/ struct in_addr sin_addr; /*Internet addres

9、s*/ 其中结构成员sin_family用来说明Socket所使用的寻址模式, 在网络编程中,其值只能是AF_INET; 成员sin_port表示TCP/IP的端口号; 成员sin_addr是in_addr结构,用来表示IP地址; in_addr的结构很简单,只有一个unsigned long型的成员变量。 TCP协议是面向连接的,在建立连接之前,经历的过程比较多。 网络程序无论是使用TCP还是UDP协议,要通过Socket传输数 据,都必须建立Socket,可以使用socket()函数建立一个Socket。 该函数的原型如下: int socket(int domain,int type,i

10、nt protocal); 参数domain的值在网络程序中只能为AF_INET,表示使用 Internet协议 参数type为连接的类型,SOCK_STREAM,表示采用TCP建立 连接; 参数protocal代表通信协议,一般设为0,表示自动选择。 bind()函数用于将IPv4 Socket寻址结构绑定到其所建立的 Socket,当有数据包到达时,Linux内核会将这个数据包让给其 绑定的Socket来处理。bind()函数的原型如下: int bind(int sockfd,const struct sockaddr_in *my_addr,int adr_len); 参数sockfd

11、是调用函数socket()的返回值; 参数my_addr用来存放绑定的IPv4寻址结构;参数adr_len为结 构sockaddr_in的长度。 使用listen()函数来监听、等待客户端的连接请求。该函数的原 型如下: int listen(int sockfd,int backlog); 参数sockfd为socket()函数的返回值;参数backlog用来指定最 大连接数,一般设为5。 当服务器端接收到客户端的连接请求时,会把连接请求放在连 接队列中,接着用accept()函数处理并接受队列中的请求。 int accept( int sockfd,struct sockadd_in *a

12、ddr,int addrlen); 参数addr用来存放客户端的IP地址,其他两个参数的设置同 bind()函数的这两个参数。 connect()函数是客户端使用的函数。当客户端建立好Socket 后,会调用这个函数向服务器端请求连接。该函数的原型如下: int connect( int sockfd,struct sockaddr_in *serv_addr,int addrlen); 参数serv_addr用来存放服务器端的IP地址,其他两个函数的 设置方法同上。 使用close()函数终止客户端与服务器端的连接。函数运行成 功返回0,否则返回-1。该函数的原型如下: int close(

13、int sockfd); 9.2.3 面向连接的echo服务编程 实例 客户端: 23 /* 创建socket */ 24 sock_fd = socket(AF_INET, SOCK_STREAM, 0); 39 /* 连接到服务端 */ 40 if (-1=connect(sock_fd, (struct sockaddr*)iMAX_COMMAND;i+) 49 send(sock_fd, buffi, 100, 0);/ 发送数据给 服务端 50 n = recv(sock_fd, tmp_buf, 100, 0); / 从服务端接 收数据 57close(sock_fd);/ 关闭套

14、接字 9.2.4 无连接的Socket通信实现 无连接的套接字不需要建立连接,省去了维护 连接的开销,所以,同样环境下一般比流套接 字传输数据速率快。无连接的套接字通信使用 recvfrom()函数和sendto()函数,定义如下: #include #include int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); int sendto(int s, const void *msg, size_t len, int flags, const str

15、uct sockaddr *to, socklen_t tolen); recvfrom()函数的原型如下: int recvfrom(int sockfd,void *buf,int len,unsigned flags,struct sockadd_in *from, int fromlen); 参数sockfd为函数socket()的返回值;参数buf用来存放接收的信息;参数 len表示接收信息的长度,一般设为sizeof(buf);参数flags一般设为0;参 数from为发送端的IP地址;参数fromlen为发送端IP地址的长度,一般设 为sizeof(from)。 sendto()

16、函数的原型如下: int sendto(int sockfd,void *buf,int len,unsigned flags,struct sockaddr_in *to,int tolen); 参数buf用来存放要发送的信息;参数to为接收端的IP地址;其余参数的 用法同recvfrom()函数。 9.2.4 无连接的Socket通信实现 9.2.5 无连接的时间服务编程实 例 服务器端: 25 sock_fd = socket(AF_INET, SOCK_DGRAM, 0); / 建立套接字 37 /* 绑定本机到套接字 */ 50 n = recvfrom(sock_fd, buff,

17、 sizeof(buff), 0, (struct sockaddr*) / 接收数据 64 strcpy(buff, asctime(gmtime(/ 生成 当前时间字符串 65 sendto(sock_fd, buff,sizeof(buff), 0,(struct sockaddr*)/ 发送时间给客户端 69 close(sock_fd);/ 关闭套接字 9.2.5 无连接的时间服务编程实 例 客户端: 22 sock_fd = socket(AF_INET, SOCK_DGRAM, 0); / 创建套接字 37 if (-1=sendto(sock_fd, buff,sizeof(b

18、uff), 0, (struct sockaddr*) / 接收返回 53 /* 退出连接 */ 54 strcpy(buff, quit); 55 if (-1=sendto(sock_fd, buff,sizeof(buff), 0, (struct sockaddr*) 57 close(sock_fd); 62 close(sock_fd);/ 关闭套接字 9.3 Socket高级应用 9.3.1 Socket超时处理 9.3.2 使用Select机制处理多连接 9.3.3 使用poll机制处理多连接 9.3.4 多线程环境Socket编程 9.3.1 Socket超时处理 超时指的是

19、预先假定一次数据传输需要的时间, 如果超过这个时间没有得到反馈,认为数据传 输失败。Socket库setsockopt()和getsockopt()用来 设置套接字和得到套接字参数,函数定义如下: #include #include int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen); 9.3.2 使用Select机制处理多连接 Socket库提供了两个函数select()和poll()用来等待一组套接字句柄 的读写操作。select()函数是比较常用的,函数定义如下: /* According to POSIX 1003.1-2001

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论