第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协议提供的最基本功能,IP协议根据数据包头中

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

3、P协议TCP协议是一个传输层协议。TCP协议位于网络互联层后,是IP协议的上层协议。TCP是一个面向连接的可靠传输协议。在一个协议栈处理程序中,如果发现数据包的IP层后携带了TCP头,会把数据包交给TCP协议层处理。TCP协议层处理完毕后,把其余数据交给应用层程序处理。9.1.4 UDP协议UDP与TCP一样是传输层协议,但是UDP协议没有控制数据包的顺序和出错重发机制。因此,UDP的数据在传输时是不稳定的。UDP另一个重要问题就是安全性不高。由于UDP没有连接的概念,在一个数据传输过程中,UDP数据包可以很容易地被伪造或者篡改。9.1.5 学习分析协议的方法学习网络协议需要一个直观的认识,推

4、荐读者使用网络协议分析的工具分析协议。目前有很多的网络协议分析工具,著名的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和UNIX System V的TLI 。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有了更大的发展

5、,其网络应用编程界面Socket在网络软件中被广泛应用,至今已引进到Windows和VxWorks等操作系统中,成为开发网络应用软件的强大工具。 Socket相当于网络上的通信节点,即IP地址加上端口号。应用程序使用了Socket之后,就可以和网络上的任何一个通信节点连接。Socket之间的通信就如同一台PC机上两个进程间的通信一样。 在Linux操作系统中,可以将Socket看成是一种设备,即一种可作双向传输的信道,Linux程序可以经过此设备与本地或是远程的程序进行通信。Socket常被翻译成套接字或者插口。它实际就是网络上的通信端点,使用者或应用程序只要连接到Socket便可以和网络上任

6、何一个通信端点连接、传输数据。Socket封装了通信的细节,在Linux系统中,为使用者提供了类似文件描述符的操作方法。Socket分成面向连接的数据流通信和无连接的数据报通信。9.2.1 创建socket对象在使用socket通信之前,需要创建socket对象。对应用程序员来说,socket对象就是一个文件句柄,通常使用socket()函数创建socket对象。函数定义如下:#include #include int socket(int domain, int type, int protocol);9.2.2 面向连接的Socket通信实现面向连接的数据流通信在TCP/IP协议簇是使用T

7、CP作为传输层协议通信,按照TCP协议的要求,通信双方需要在传输数据前建立连接,术语上称做“TCP的三次握手”。对应用程序员来说,这个过程是透明的。9.2.2 面向连接的Socket通信实现9.2.3 面向连接的echo服务编程实例服务器端:24 /* 创建socket */25 sock_fd = socket(AF_INET, SOCK_STREAM, 0);40 /* 把地址和套接字绑定 */41 if(bind(sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)!= 0) 49 /* 设置套接字监听 */50 if(

8、listen(sock_fd ,MAX_CLIENT_NUM) != 0) 77 close(clientfd);/ 关闭新建的连接78 close(sock_fd);/ 关闭服务端监听的socket 目前,Internet仍使用IPv4作为寻址模式。在Socket中,寻址模式的结构为sockadd_in,定义如下:struct sockadd_insa_family_t sin_family; /*addressing mode*/unsigned short int sin_port; /*port number*/struct in_addr sin_addr; /*Internet a

9、ddress*/其中结构成员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,int

10、 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是调用函数soc

11、ket()的返回值;参数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 *addr,int addrlen);

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

13、cho服务编程实例客户端:23 /* 创建socket */24 sock_fd = socket(AF_INET, SOCK_STREAM, 0);39 /* 连接到服务端 */40 if (-1=connect(sock_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr) 47 /* 发送并接收缓冲的数据 */48 for (i=0;iMAX_COMMAND;i+) 49 send(sock_fd, buffi, 100, 0);/ 发送数据给服务端50 n = recv(sock_fd, tmp_buf, 100, 0); /

14、从服务端接收数据57close(sock_fd);/ 关闭套接字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 le

15、n, int flags, const struct 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地址的长度,一般设为size

16、of(from)。 sendto()函数的原型如下: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

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

18、DGRAM, 0); / 创建套接字37 if (-1=sendto(sock_fd, buff,sizeof(buff), 0, (struct sockaddr*)&serv,servlen) / 发送请求44 n = recvfrom(sock_fd, buff, sizeof(buff), 0, (struct sockaddr*)&serv,&servlen); / 接收返回53 /* 退出连接 */54 strcpy(buff, quit);55 if (-1=sendto(sock_fd, buff,sizeof(buff), 0, (struct soc

19、kaddr*)&serv,servlen) 56 perror(send data);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超时处理超时指的是预先假定一次数据传输需要的时间,如果超过这个时间没有得到反馈,认为数据传输失败。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()函数是比较常用的,函数

温馨提示

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

评论

0/150

提交评论