第7讲 CH5-传输层与TCPIP网络编程

上传人:壹****1 文档编号:569397767 上传时间:2024-07-29 格式:PPT 页数:67 大小:1.49MB
返回 下载 相关 举报
第7讲 CH5-传输层与TCPIP网络编程_第1页
第1页 / 共67页
第7讲 CH5-传输层与TCPIP网络编程_第2页
第2页 / 共67页
第7讲 CH5-传输层与TCPIP网络编程_第3页
第3页 / 共67页
第7讲 CH5-传输层与TCPIP网络编程_第4页
第4页 / 共67页
第7讲 CH5-传输层与TCPIP网络编程_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《第7讲 CH5-传输层与TCPIP网络编程》由会员分享,可在线阅读,更多相关《第7讲 CH5-传输层与TCPIP网络编程(67页珍藏版)》请在金锄头文库上搜索。

1、第三章 面向连接的网络通信实现1. 万维网通信的特点2. 传输层协议概述3. 传输控制协议TCP4. TCP传输协议报文头格式5. TCP/IP通信的实现6. TCP/IP 网络编程举例13.3 传输控制协议TCP1. TCP协议特点2. TCP的连接3. TCP传输连接管理21. 传输控制协议特点nTCPTCP主要特点主要特点n面向连接面向连接的传输层协议。的传输层协议。nTCP TCP 连接只能是连接只能是点对点点对点的(一对一)。的(一对一)。 nTCP TCP 提供提供可靠交付可靠交付的服务。的服务。nTCP TCP 提供提供全双工全双工通信。通信。n面向字节流面向字节流。 37 68

2、HTCP 面向流的概念 发送 TCP 报文段发送方接收方把字节写入发送缓存从接收缓存读取字节应用进程应用进程1230181716151419202145131211H109 H加上 TCP 首部构成 TCP 报文段TCPTCP字节流字节流H表示 TCP 报文段的首部x表示序号为 x 的数据字节TCP 连接4应当注意nTCP TCP 连接是一条连接是一条虚连接虚连接;nTCP TCP 对应用进程一次把多长的报文发送到对应用进程一次把多长的报文发送到TCP TCP 的缓存中是的缓存中是不关心的;不关心的;nTCP TCP 根据对方给出的根据对方给出的窗口值窗口值和当前和当前网络拥塞的程度网络拥塞的

3、程度来决定来决定一个报文段应包含多少个字节(一个报文段应包含多少个字节(UDP UDP 发送的报文长度是应发送的报文长度是应用进程给出的)。用进程给出的)。nTCP TCP 可把太长的数据块划分短一些再传送。可把太长的数据块划分短一些再传送。TCP TCP 也可等待也可等待积累有足够多的字节后再构成报文段发送出去。积累有足够多的字节后再构成报文段发送出去。 52 TCP的连接 nTCP TCP 把连接作为最基本的抽象。把连接作为最基本的抽象。n每一条每一条 TCP TCP 连接有两个端点。连接有两个端点。n套接字套接字(Socket)(Socket)或或插口插口nTCP TCP 连接连接的端点

4、不是主机,不是主机的的端点不是主机,不是主机的IP IP 地址,地址,不是应用进程,也不是传输层的协议端口。不是应用进程,也不是传输层的协议端口。TCP TCP 连连接的端点叫做接的端点叫做套接字套接字。n端口号端口号拼接到拼接到( (contatenatedcontatenated with) IP with) IP 地址地址即构成了套接字。即构成了套接字。 6套接字 (socket) 套接字 socket = (IP地址: 端口号)n每一条每一条 TCP TCP 连接唯一地被通信两端的两个连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:端点(即两个套接字)所确定。即: TCP 连

5、接 := socket1, socket2 = (IP1: port1), (IP2: port2)7893. TCP传输连接管理1 TCP 的连接建立2 TCP 的连接释放3 TCP 连接的实现103. TCP传输连接管理n传输连接就有三个阶段,即:传输连接就有三个阶段,即:连接建立连接建立、数据传送数据传送和和连接释放连接释放。传输连接的管理就是使传输连接的建立和。传输连接的管理就是使传输连接的建立和释放都能正常地进行。释放都能正常地进行。n连接建立过程中要解决以下三个问题:连接建立过程中要解决以下三个问题:n要使每一方能够确知对方的存在。要使每一方能够确知对方的存在。n要允许双方协商一些

6、参数(如最大报文段长度,最大窗口大要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。小,服务质量等)。n能够对传输实体资源(如缓存大小,连接表中的项目等)进能够对传输实体资源(如缓存大小,连接表中的项目等)进行分配。行分配。 11客户服务器方式 nTCPTCP连接建立的连接建立的客户服务器方式客户服务器方式。n主动发起连接建立的应用进程叫做主动发起连接建立的应用进程叫做客户客户(client)(client)。n被动等待连接建立的应用进程叫做被动等待连接建立的应用进程叫做服务器服务器(server)(server)。 12用三次握手建立 TCP 连接 SYN = 1, se

7、q = xCLOSEDCLOSED主动打开被动打开AB客户服务器TCP 的连接建立A 的 TCP 向 B 发出连接请求报文段,其首部中的同步位 SYN = 1,并选择序号 seq = x,表明传送数据时的第一个数据字节的序号是 x。13用三次握手建立 TCP 连接 SYN = 1, seq = xCLOSEDCLOSED主动打开被动打开AB客户服务器TCP 的连接建立SYN = 1, ACK = 1, seq = y, ack= x 1 B 的 TCP 收到连接请求报文段后,如同意,则 发回确认。 B 在确认报文段中应使 SYN = 1,使 ACK = 1, 其确认号ack = x 1,自己选

8、择的序号 seq = y。14SYN = 1, seq = xACK = 1, seq = x + 1, ack = y 1CLOSEDCLOSED主动打开被动打开AB客户服务器SYN = 1, ACK = 1, seq = y, ack= x 1 A 收到此报文段后向 B 给出确认,其 ACK = 1, 确认号 ack = y 1。 A 的 TCP 通知上层应用进程,连接已经建立。 15SYN = 1, seq = xACK = 1, seq = x + 1, ack = y 1CLOSEDCLOSED数据传送主动打开被动打开AB客户服务器SYN = 1, ACK = 1, seq = y,

9、 ack= x 1 B 的 TCP 收到主机 A 的确认后,也通知其上层 应用进程:TCP 连接已经建立。16SYN-SENTESTAB-LISHEDSYN-RCVDLISTENESTAB-LISHED用三次握手建立 TCP 连接的各状态 SYN = 1, seq = xACK = 1, seq = x + 1, ack = y 1CLOSEDCLOSED数据传送主动打开被动打开AB客户服务器TCP 的连接建立SYN = 1, ACK = 1, seq = y, ack= x 117FIN = 1, seq = uCLOSED主动关闭数据传送ESTAB-LISHEDESTAB-LISHEDAB

10、客户服务器CLOSEDTCP 的连接释放 数据传输结束后,通信的双方都可释放连接。 现在 A 的应用进程先向其 TCP 发出连接释放 报文段,并停止再发送数据,主动关闭 TCP 连接。 A 把连接释放报文段首部的 FIN = 1,其序号 seq = u,等待 B 的确认。18FIN = 1, seq = uACK = 1, seq = v, ack= u 1主动关闭数据传送通知应用进程ESTAB-LISHEDESTAB-LISHEDAB客户服务器TCP 的连接释放 B 发出确认,确认号 ack = u 1, 而这个报文段自己的序号 seq = v。 TCP 服务器进程通知高层应用进程。 从 A

11、 到 B 这个方向的连接就释放了,TCP 连接 处于半关闭状态。B 若发送数据,A 仍要接收。19FIN = 1, seq = uACK = 1, seq = v, ack= u 1FIN = 1, ACK = 1, seq = w, ack= u 1主动关闭被动关闭数据传送通知应用进程ESTAB-LISHEDESTAB-LISHEDAB客户服务器数据传送TCP 的连接释放 若 B 已经没有要向 A 发送的数据, 其应用进程就通知 TCP 释放连接。 20FIN = 1, seq = uACK = 1, seq = v, ack= u 1FIN = 1, ACK = 1, seq = w, a

12、ck= u 1主动关闭被动关闭数据传送通知应用进程ESTAB-LISHEDESTAB-LISHEDAB客户服务器数据传送TCP 的连接释放 A 收到连接释放报文段后,必须发出确认。 ACK = 1, seq = u + 1, ack = w 121FIN = 1, seq = uACK = 1, seq = v, ack= u 1FIN = 1, ACK = 1, seq = w, ack= u 1主动关闭被动关闭数据传送通知应用进程ESTAB-LISHEDESTAB-LISHEDAB客户服务器数据传送TCP 的连接释放 在确认报文段中 ACK = 1,确认号 ack w 1, 自己的序号 s

13、eq = u + 1。 ACK = 1, seq = u + 1, ack = w 122CLOSEDACK = 1, seq = u + 1, ack = w 1FIN = 1, seq = uACK = 1, seq = v, ack= u 1FIN = 1, ACK = 1, seq = w, ack= u 1FIN-WAIT-1CLOSE-WAITFIN-WAIT-2LAST-ACK等待 2MSLTIME-WAIT主动关闭被动关闭数据传送通知应用进程ESTAB-LISHEDESTAB-LISHEDAB客户服务器数据传送CLOSED5.9.2 TCP 的连接释放 TCP 连接必须经过时间

14、 2MSL 后才真正释放掉。 23A 必须等待 2MSL 的时间n第一,为了保证第一,为了保证 客户客户A A 发送的最后一个发送的最后一个 ACK ACK 报报文段能够到达文段能够到达 服务器服务器B B。n第二,防止第二,防止 “已失效的连接请求报文段已失效的连接请求报文段”出现在出现在本连接中。本连接中。A A 在发送完最后一个在发送完最后一个 ACK ACK 报文段后,报文段后,再经过时间再经过时间 2MSL2MSL,就可以使本连接持续的时间内,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这

15、种旧的连接可以使下一个新的连接中不会出现这种旧的连接请求报文段。请求报文段。243.4 TCP传输协议报文头格式25TCP首部20 字节的固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FIN32 位SYNRSTPSHACKURG位 0 8 16 24 31填 充TCP 数据部分TCP 首部TCP 报文段IP 数据部分IP 首部发送在前 TCP 报文段的首部格式 26TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSH

16、ACKURG位 0 8 16 24 31填 充源端口和目的端口字段各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。 27TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充序号字段占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。 28TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源

17、 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充确认号字段占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。 29TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充数据偏移(即首部长度)占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位字(以 4 字节为计算单位)。 30TCP首部20字节固

18、定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充保留字段占 6 位,保留为今后使用,但目前应置为 0。 31TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充紧急 URG 当 URG 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 32TCP首部20字节

19、固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充确认 ACK 只有当 ACK 1 时确认号字段才有效。当 ACK 0 时,确认号无效。 33TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充推送 PSH (PuSH) 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个

20、缓存都填满了后再向上交付。 34TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充复位 RST (ReSeT) 当 RST 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。 35TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充

21、同步 SYN 同步 SYN = 1 表示这是一个连接请求或连接接受报文。 36TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充终止 FIN (FINis) 用来释放一个连接。FIN 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 37TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 2

22、4 31填 充窗口字段 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。38TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG位 0 8 16 24 31填 充检验和 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。39TCP首部20字节固定首部目 的 端 口数据偏移检 验 和选 项 (长 度 可 变)源 端 口序 号紧 急 指 针窗 口确 认 号保 留FINSYNRSTPSHACKURG

23、位 0 8 16 24 31填 充紧急指针字段 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 403.5 TCP/IP通信的实现1.系统调用机制2. 套接字Socket的作用3. 套接字连接的建立41 1. TCP/IP通信的实现n操作系统的操作系统的系统调用系统调用(system call)(system call)机制机制n操作系统通过操作系统通过系统调用系统调用在应用程序和操作系在应用程序和操作系统之间传递控制权。统之间传递控制权。n对程序员来说,每一个对程序员来说,每一个系统调用系统调用和一般程序和一般程序设计中的设计中的函数调用函数调用非

24、常相似,只是系统调用非常相似,只是系统调用是将控制权传递给了操作系统。是将控制权传递给了操作系统。 42多个应用进程使用系统调用的机制 应用程序 1应用程序 2应用程序 n由应用程序调用的系统函数用户地址空间中的应用程序系统调用接口系统地址空间中的协议软件包括 TCP/IP 协议软件的操作系统内核43应用编程接口 API(Application Programming Interface) n当某个应用进程启动系统调用时,控制权就从应用进当某个应用进程启动系统调用时,控制权就从应用进程传递给了程传递给了系统调用接口系统调用接口。n操作系统将此调用转给某个内部过程,并执行所请求操作系统将此调用转

25、给某个内部过程,并执行所请求的操作。的操作。n内部过程一旦执行完毕,控制权就又通过系统调用接内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。口返回给应用进程。n系统调用接口系统调用接口实际上就是应用进程的控制权和操作系实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,即统的控制权进行转换的一个接口,即应用编程接口应用编程接口 APIAPI。 44应用进程通过套接字接入到网络 应用进程TCP由应用程序控制因特网由操作系统控制客户服务器套接字TCP应用进程套接字452. 套接字的作用 n操作系统创建套接字操作系统创建套接字n应应用用进进程程请请求求操操作作系系统统为为

26、其其创创建建“套套接接字字”,以以便便把把网网络络通通信所需要的系统资源信所需要的系统资源分配给该应用进程;分配给该应用进程;n操作系统建立操作系统建立套接字描述符套接字描述符n建建立立好好后后,把把此此号号码码返返回回给给应应用用进进程程。应应用用进进程程所所进进行行的的网网络操作都必须使用这个号码。络操作都必须使用这个号码。n应用进程关闭套接字应用进程关闭套接字n通通信信完完毕毕后后,应应用用进进程程通通过过一一个个关关闭闭套套接接字字的的系系统统调调用用通通知知操作系统回收与该操作系统回收与该“号码号码”相关的所有资源。相关的所有资源。46socket有多种不同意思 n应应用用编编程程接

27、接口口 APIAPI 称称为为 socket socket API, API, 简简称称为为 socketsocket。nsocket API socket API 中使用的一个函数名也叫作中使用的一个函数名也叫作socketsocket。n调用调用 socket socket 函数的端点称为函数的端点称为 socketsocket。n调调用用 sockesocke t t函函数数时时其其返返回回值值称称为为 socketsocket描描述述符符,可简称为可简称为 socketsocket。n在在操操作作系系统统内内核核中中连连网网协协议议的的 Berkeley Berkeley 实实现现,称

28、称为为 socket socket 实现。实现。 47套接字描述符表(每一个进程一个描述符)0:1:2:3:4:操作系统套接字的数据结构协议族:PF_INET服务:SOCK_STREAM本地 IP 地址:远地 IP 地址:本地端口:远地端口:调用 socket 创建套接字 483. 套接字连接的建立n系统套接字调用顺序服务器端socketbindlistenacceptrecvsendclose客户端socketrecvsendcloseconnect连接建立请求49伯克利套接字(Berkeley Socket)nTCPTCP套接字传输原语套接字传输原语503. 套接字连接的建立- 客户端n创

29、建一个套接字创建一个套接字n用用socketsocket原语创建一个套接字描述字结构。当套接字被原语创建一个套接字描述字结构。当套接字被创建后,它的端口号和创建后,它的端口号和 IP IP 地址都是空的。地址都是空的。n客户端开始连接请求客户端开始连接请求n利用利用connectconnect原语,向服务器发出原语,向服务器发出TCPTCP连接请求,采用三连接请求,采用三次握手协议。次握手协议。n客户端进入数据接收客户端进入数据接收/ /发送模式发送模式n当收到应答后,当收到应答后,TCPTCP连接成功建立,即可采用连接成功建立,即可采用sendsend和和recvrecv原语进行数据收发。原

30、语进行数据收发。513. 套接字连接的建立-服务器端n把本地地址绑定到套接字把本地地址绑定到套接字n当套接字被创建后,它的端口号和当套接字被创建后,它的端口号和 IP IP 地址都是空的,因此应用地址都是空的,因此应用进程要调用进程要调用 bindbind(绑定)来指明套接字的本地地址。在服务器端(绑定)来指明套接字的本地地址。在服务器端调用调用 bind bind 时就是把熟知端口号和本地时就是把熟知端口号和本地IPIP地址填写到已创建的套地址填写到已创建的套接字中。接字中。n服务器进入被动监听方式服务器进入被动监听方式n在调用在调用 bind bind 后,还必须调用后,还必须调用 lis

31、tenlisten(收听)把套接字设置为被(收听)把套接字设置为被动方式,以便随时接受客户的服务请求。动方式,以便随时接受客户的服务请求。nUDPUDP服务器由于只提供无连接服务,不使用服务器由于只提供无连接服务,不使用 listen listen 系统调用。系统调用。n服务器进入接受方式服务器进入接受方式n紧接着就调用紧接着就调用 acceptaccept(接受),以便把远地客户进程发来的连接(接受),以便把远地客户进程发来的连接请求提取出来;请求提取出来;n系统调用系统调用 accept accept 的一个变量就是要指明从哪一个套接字发起的的一个变量就是要指明从哪一个套接字发起的连接。连

32、接。 523.6 TCP/IP 网络编程举例1. 万维网通信的特点2. 传输层协议概述3. 传输控制协议TCP4. TCP传输协议报文头格式5. TCP/IP通信的实现6. TCP/IP 网络编程举例53套接字地址结构structstruct sockaddrsockaddr 结构结构 1. 1. 为许多类型的套接字储存套接字地址信息:为许多类型的套接字储存套接字地址信息: 2.2.结构定义结构定义3.3.structstruct sockaddrsockaddr unsigned short unsigned short sa_familysa_family; /* ; /* 地址家族地址家

33、族, , AF_INET */ AF_INET */ char sa_data14; /*14char sa_data14; /*14字节协议字节协议地址、套接地址、套接 字目标地址和端口。字目标地址和端口。 * */ / ; ; 54用这个数据结构可以轻松处理套接字地址的基本元素。用这个数据结构可以轻松处理套接字地址的基本元素。 3. 一个并列的套接字地址信息结构:一个并列的套接字地址信息结构: struct sockaddr_in (in 代表Internet。) 结构定义为:结构定义为: struct sockaddr_in short int sin_family; /* 通信类型 *

34、/ unsigned short int sin_port; /* 端口 */ struct in_addr sin_addr; /* Internet 地址 */ unsigned char sin_zero8; /* 与sockaddr结构的长度 相同*/ ; 55IP 地址和如何处理它们 n假设你已经有了一个sockaddr_in结构体ina,你有一个IP地 址132.241.5.10要储存在其中,你就要用到函数inet_addr(),将IP地址从 点数格式转换成无符号长整型。使用方法如下: nina.sin_addr.s_addr = inet_addr(132.241.5.10);

35、n注意,inet_addr()返回的地址已经是网络字节格式, 56socket()函数 n调用格式nint socket(int domain, int type, int protocol);n参数含义:ndomain:设置成 “AF_INET”,象 sockaddr_in结构;ntype:是 SOCK_STREAM 和 SOCK_DGRAM类型。nProtocol:设置为 “0”。n返回n返回在系统调用中要用到的 socket 描述符,或在错误的时候返回-1。57bind()函数 n将套接字和机器上的一定的端口关联起来。n调用方法:int bind(int sockfd, struct s

36、ockaddr *my_addr, int addrlen); n参数nSockfd:调用 socket 返回的文件描述符 ;n my_addr:数据结构 struct sockaddr指针,保存本机地址(即端口和 IP 地址) 信息;nAddrlen:设置为 sizeof(struct sockaddr)。n返回n绑定成功与否标致。 58Bind()函数使用举例#include #include #include #define MYPORT 3490 main() int sockfd; struct sockaddr_in my_addr; sockfd = socket(AF_INET

37、, SOCK_STREAM, 0); /*需要错误检查 */ my_addr.sin_family = AF_INET; /* 主机字节顺序 */ my_addr.sin_port = htons(MYPORT); /* 网络字节顺序 */ my_addr.sin_addr.s_addr = inet_addr(132.241.5.10); bzero(&(my_addr.sin_zero),; /* 把结构剩余部分置零 */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr); 59connect()程序-如何连

38、接到远程主机 n系统调用 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); n参数nsockfd 是系统调用 socket() 返回的套接字文件描述符;nserv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr ;naddrlen 设置 为 sizeof(struct sockaddr) 。n使用方法60main() int sockfd; struct sockaddr_in dest_addr; /* 目的地址*/ sockfd = socket(AF_INET, SO

39、CK_STREAM, 0); /* 错误检查 */ dest_addr.sin_family = AF_INET; /* 主机字节顺序 */ dest_addr.sin_port = htons(DEST_PORT); /* 网络字节顺序 */ dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); bzero(&(dest_addr.sin_zero),; /* zero the rest of the struct */ connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sock

40、addr); 。61listen()函数 n系统调用 int listen(int sockfd, int backlog); n参数nsockfd 是调用 socket() 返回的套接字文件描述符 nbacklog 是在进入队列中允许的连接数目,即进入的连接是在队列中一直等待直到你接受 (accept()函数)连接n返回n在发生错误的时候返回-1,并设置全局错误变量 errno。 62accept()函数 n函数调用nSOCKET accept(int sockfd, void *addr, int *addrlen); nsockfd :是和 listen() 中一样的套接字描述符 nad

41、dr:指向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你可以测定那个地址在那个端口呼叫你)。n返回n将返回一个新的套接字文 件描述符。这样有两个套接字,原来的一个还在侦听你的那个端口,而新套接字则准备发送 (send() 和接收 ( recv() 数据。 n使用 63nmain()nnintsockfd,new_fd;/*在sock_fd上侦听,在new_fd上创建新链接*/nstructsockaddr_inmy_addr;/*地址信息*/nstructsockaddr_intheir_addr;/*对方地址信息*/nintsin_size;nsockf

42、d=socket(AF_INET,SOCK_STREAM,0);/*错误检查*/nmy_addr.sin_family=AF_INET;/*主机字节顺序*/nmy_addr.sin_port=htons(MYPORT);/*网络字节顺序*/nmy_addr.sin_addr.s_addr=INADDR_ANY;/*用我的IP自动填充*/nbzero(&(my_addr.sin_zero),;/*结构的其他部分置零*/nbind(sockfd,(structsockaddr*)&my_addr,sizeof(structsockaddr);nlisten(sockfd,BACKLOG);nsin

43、_size=sizeof(structsockaddr_in);nnew_fd=accept(sockfd,&their_addr,&sin_size);n64send()-流式套接字的发送 n函数声明int send(int sockfd, const void *msg, int len, int flags);n参数nSockfd:发送数据socket(是socket() 或accept()返回的 nmsg 是指向你想发送的数据的指针 nlen 是数据的长度 nflags 设置为 0 n返回n实际发送的数据的字节数 65recv()-流式套接字的接收 函数声明int recv(int s

44、ockfd, void *buf, int len, unsigned int flags); 参数nsockfd 要读的套接字描述符 nbuf 是要读的信息的缓冲 nlen 是缓 冲的最大长度 nflags 设置为 0 返回n返回实际读入缓冲的数据的字节数 66close()和shutdown()函数 函数声明 close(sockfd); int shutdown(int sockfd, int how); 参数nsockfd 是你想要关闭的套接字文件描述符nhow 的值是下面的其中之一: n0 - 不允许接受 n1 - 不允许发送 n2 - 不允许发送和接受(和 close() 一样) 返回nshutdown() 成功时返回 0,失败时返回 -167

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号