通信应用软件设计TP3.ppt_第1页
通信应用软件设计TP3.ppt_第2页
通信应用软件设计TP3.ppt_第3页
通信应用软件设计TP3.ppt_第4页
通信应用软件设计TP3.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

第二章 基本的TCP套接字 通信应用软件设计 2 目标 掌握TCP客户端程序编写的基本步骤掌握TCP服务器程序编写的基本步骤了解TCP程序的特点掌握TCP中涉及的阻塞型函数了解IPv4程序和IPv6程序的区别 3 编写一个简单的TCP程序 示例实现一个应答协议 工作方式如下 客户连接到服务器并发送数据 服务器简单地把它接收到的任何内容发送回客户并断开连接 4 IPv4TCP客户 4个基本步骤使用socket 创建TCP套接字使用connect 建立到达服务器的连接使用send 和recv通信使用close 关闭连接 5 TCPEchoClient4 c include include include include include include include include include Practical h intmain intargc char argv if argc4 测试命令行参数是否正确DieWithUserMessage Parameter s char servIP argv 1 第1个参数 服务器IP地址char echoString argv 2 第2个参数 发送的字符串 6 in port tservPort argc 4 atoi argv 3 7 intsock socket AF INET SOCK STREAM IPPROTO TCP if sock 0 DieWithSystemMessage socket failed structsockaddr inservAddr memset 7 if rtnVal 0 DieWithUserMessage inet pton failed invalidaddressstring elseif rtnVal 0 DieWithSystemMessage inet pton failed servAddr sin port htons servPort if connect sock structsockaddr 8 if numBytes 0 DieWithSystemMessage send failed elseif numBytes echoStringLen DieWithUserMessage send sentunexpectednumberofbytes unsignedinttotalBytesRcvd 0 fputs Received stdout 9 while totalBytesRcvd echoStringLen charbuffer BUFSIZE numBytes recv sock buffer BUFSIZE 1 0 if numBytes 0 DieWithSystemMessage recv failed elseif numBytes 0 DieWithUserMessage recv connectionclosedprematurely totalBytesRcvd numBytes buffer numBytes 0 fputs buffer stdout 10 fputc n stdout close sock exit 0 11 DieWithMessage c include includevoidDieWithUserMessage constchar msg constchar detail fputs msg stderr fputs stderr fputs detail stderr fputc n stderr exit 1 voidDieWithSystemMessage constchar msg perror msg exit 1 12 IPv4TCP服务器 步骤使用socket 创建TCP套接字使用bind 给套接字分配地址和端口好使用listen 告诉系统允许对该端口建立连接反复执行以下操作调用accept 为每个客户连接获取新的套接字使用send 和recv 通过新的套接字与客户通信使用close 关闭客户连接 13 在服务器上 需要把套接字与地址和端口号相关联 使得客户端连接可以到达正确的位置 宏INADDR ANY表示该程序应用于该机器上的任何地址 htonl htons是英文HostaddressToNetworkaddress LongTypeHostaddressToNetworkaddress ShortType TCPEchoServer4 c 14 创建和销毁套接字 1 要使用TCP或UDP 程序首先要求操作系统创建套接字抽象层的实例 intsocket intdomain inttype intprotocol 第一个参数确定了套接字的通信领域 AF INETAF INET6第二个参数指定套接字的类型SOCKET STREAMSOCKET DGRAM第三个参数指定要使用的端到端协议 IPPROTO TCPIPPROTO UDP 15 创建和销毁套接字 2 socket函数返回通信实例的句柄 实际上就是一个整数 唯一的 随机的 非负值表示成功 1表示失败 这种句柄 套接字描述符 被传递给其他API函数 以标识要在其上执行操作的套接字抽象层 当利用套接字完成应用程序时 调用close 关闭链接 intclose intsocket 16 通用地址 SocketsAPI定义了一种泛型数据类型 sockaddr结构 用于指定与套接字关联的地址 structsockaddr sa family tsa family charsa data 14 typedefunsignedshortintsa family t 17 IPv4地址 structin addr in addr ts addr structsockaddr in sa family tsa family in port tsin port Portnumber structin addrsin addr Internetaddress unsignedcharsin zero 8 18 IPv6地址 structsockaddr in6 SOCKADDR COMMON sin6 in port tsin6 port Transportlayerport uint32 tsin6 flowinfo IPv6flowinformation structin6 addrsin6 addr IPv6address uint32 tsin6 scope id IPv6scope id 19 通用地址存储器 如果想为一个地址结构分配资源 但是不知道实际的地址类型 泛型sockaddr不能用 但可以用sockaddr storage结构 20 二进制 字符串地址转换 1 如何将字符串型的IP地址如 192 168 0 100转化为数字型的32位数字 反之也需要将32位的数字型IP转化为字符型IP地址intinet pton intaddressFamily char src void dst intinet ntop intaddressFamily char src void dst socklen tdstBytes 21 二进制 字符串地址转换 2 include includeintmain unsignedintdst inet pton AF INET 192 168 0 100 22 二进制 字符串地址转换 3 将该文件保存为ptonExp c 编译执行后的结果如下 23 获取套接字的关联地址 系统把本地和外部地址与每个连接的套接字相关联 可以为本地地址使用getsockname 以及为外部地址使用getpeername 来查明这些地址 intgetpeername intsocket sockaddr remoteAddress socklen t len intgetsockname intsocket sockaddr localAddress socklen t len 24 连接套接字 TCP程序必须建立连接 服务器程序必须首先启动 等待客户端的连接 客户端使用connect函数与服务器建立TCP连接 intconnect intsocket conststructsockaddr foreignAddress socklen taddressLength 25 绑定到地址 服务器必须把自己的IP地址和端口号绑定到套接字上 intbind intsocket structsockaddr localAddress socklen tlen 具有多个Internet地址的主机上的服务器可能绑定到一个特殊的地址 如果服务器希望接收和发送数据在主机的任何IP地址上 可将地址设置为INADDR ANY或IN6ADDR ANY 前者是主机字节顺序 后者是网络字节顺序 26 处理进入的连接 绑定后服务器执行listen进行侦听intlisten intsocket intqueueLimit 一旦把套接字配置为侦听 程序就可以开始其上的客户连接 intaccept intsocket structsockaddr clientAddress socklen t len accept是阻塞型函数 27 通信 一旦连接上就可以发送 接收数据 任何一方可以首先发送数据 接收数据的函数recv是阻塞型函数 ssize tse

温馨提示

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

评论

0/150

提交评论