- 1、本文档共37页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章__TCP网络编程基础
第7章 TCP网络编程基础 TCP协议是TCP/IP协议中很重要的一个协议,它由于传输的稳定性,在很多程序中都在使用,例如HTTP、FTP等协议都是在TCP的基础上进行构建的。本章介绍TCP套接字的编程基础知识,主要包含如下内容: 套接字编程的基础知识的部分,介绍套接字编程中经常使用的套接字地址结构,对内核和应用层之间的内存数据传递方式进行了简单的介绍。 TCP网络编程的流程部分,简单介绍TCP套接字服务器、客户端的编程框架,对函数socket()、bind()、listen()、accept()、connect()、close()函数进行了介绍,并提及如何使用read()和write()函数进行数据的读取和发送。 7.1 套接字编程基础知识 在进行套接字编程之前需要对基本的数据结构有所了解。本节对套接字的地址结构定义的形式、如何使用套接字的地址结构进行详细的介绍,并且对Linux操作系统中用户空间和用户空间之间的交互过程进行简单的介绍,用户对网络程序设计的方法有比较深入的了解。 7.1.1 套接字地址结构 进行套接字编程需要指定套接字的地址作为参数,不同的协议族有不同的地址结构定义方式。这些地址结构通常以sockaddr_开头,每一个协议族有一个唯一的后缀,例如对于以太网,其结构名称为sockaddr_in。 1.通用套接字数据结构 2.实际使用的套接字数据结构 3.结构sockaddr和结构sockaddr_in的关系 7.1.1 套接字地址结构 7.1.2 用户层和内核层交互过程 套接字参数中有部分参数是需要用户传入的,这些参数用来与Linux内核进行通信,例如指向地址结构的指针。通常是采用内存复制的方法进行。例如bind()函数需要传入地址结构struct sockaddr *my_addr和my_addr指向参数的长度。 1.向内核传入数据的交互过程 2.内核传出数据的交互过程 7.1.2 用户层和内核层交互过程 7.2 TCP网络编程流程 TCP网络编程是目前比较通用的方式,例如HTTP协议、FTP协议等很多广泛应用的协议均基于TCP协议。TCP编程主要为C/S模式,即服务器(S)、客户端(C)模式。TCP网络编程的流程包含服务器和客户端两种模式,这两种模式之间的程序设计的流程存在很大的差别。 7.2.1 TCP网络编程架构 TCP网络编程有两种模式,一种是服务器模式,另一种是客户端模式。服务器模式创建一个服务程序,等待客户端用户的连接,接收到用户的连接请求后,根据用户的请求进行处理;客户端模式则根据目的服务器的地址和端口进行连接,向服务器发送请求并对服务器的响应进行数据处理。 1.服务器端的程序设计模式 2.客户端的程序设计模式 3.客户端与服务器的交互过程 7.2.1 TCP网络编程架构 7.2.2 创建网络插口函数socket() 网络程序设计中的套接字系统调用函数socket()用来获得文件描述符。 1.函数socket()介绍 2.应用层函数socket()和内核函数之间的关系 7.2.2 创建网络插口函数socket() 7.2.3 绑定一个地址端口对bind() 在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。 1.函数bind()介绍 2.函数bind()的例子 3.应用层bind()函数和内核函数之间的关系 7.2.3 绑定一个地址端口对bind() 7.2.4 监听本地端口listen 在7.2.1小节中简单介绍了服务器模式的方式,服务器模式中有listen()和accept()两个函数,而客户端则不需要这两个函数。函数listen()用来初始化服务器可连接队列,服务器处理客户端连接请求的时候是顺序处理的,同一时间仅能处理一个客户端连接。当多个客户端的连接请求同时到来的时候,服务器并不是同时处理,而是讲不能进行处理的客户端连接请求放到等待队列中,这个队列的长度由listen()函数来定义。 1.函数listen()介绍 2.函数listen()的例子 3.应用层listen()函数和内核函数之间的关系 7.2.4 监听本地端口listen 7.2.4 监听本地端口listen 7.2.5 接受一个网络请求accept() 当一个客户端的连接请求到达服务器主机侦听的端口时,此时客户端的连接会在队列中等待,直到使用服务器处理接收请求。 函数accept()成功执行后,会返回一个新的套接口文件描述符来表示客户端的连接,客户端连接的信息可以通过这个新描述符来获得。因此当服务器成功处理客户端的请求连接后,会有两个文件描述符,老的文件描述符表示正在监听的socket,新产生的文件描述符表示客户端的连接,函数send()和recv
文档评论(0)