分享
分销 收藏 举报 申诉 / 29
播放页_导航下方通栏广告

类型第03章+基本TCP套接口编程.ppt

  • 上传人:xrp****65
  • 文档编号:13220949
  • 上传时间:2026-02-05
  • 格式:PPT
  • 页数:29
  • 大小:167.50KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    03 基本 TCP 接口 编程
    资源描述:
    ,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Tcp,套接字编程,TCP,套接字编程(,cont.,),基本套接字函数,socket,#include,int,socket(int,family,int,type,int,protocol),返回:非负套接字(,sockfd,)成功;,-1,出错。,family:,协议族;,type:,套接字类型,;protocol,:,一般为,0,,除原始套接字外。,family type,AF_INET IPv4,协议,SOCK_STREAM,字节流套接口,AF_INET6IPv6,协议,SOCK_DGRAM,数据报套接口,AF_LOCAL,unix,域协议,SOCK_RAW,原始套接口,AF_ROUTE,路由套接口,AF_KEY,密钥套接口,Protocol,:指明此,socket,请求所使用的协议,可以使用如下相关符号常数来表示。,IPPROTO_TCP:,表示,TCP,协议,IPPROTO_UDP:,表示,UDP,协议,基本套接字函数,bind,#include,int,bind(int,sockfd,const,struct,sockaddr*,addr,socklen_len,len,),返回:,0,成功;,-1,出错并置,errno,该函数指明套接字将使用本地的哪一个协议端口进行数据传送(,IP,地址和端口号),注意:协议地址,addr,是通用地址。,Len,是该地址结构(第二个参数)的长度。,一般而言,服务器调用此函数,而客户则很少调用它。,绑定地址时,可以指定地址和端口号,也可以指定其中之一,甚至一个也不指定。通配地址:,INADDR_ANY,,其值一般为,0,,它通知内核选择,IP,地址。,IP,地址 端口 结果,通配地址,0,内核选择,IP,地址和端口号,通配地址 非,0,内核选择,IP,地址,进程指定端口,本地,IP 0,进程指定,IP,地址,内核选择端口,本地,IP,非,0,进程指定,IP,地址和端口号,若指定端口号为,0,,调用函数,bind,时,内核选择一个临时端口,(,在实际中,端口号都要指定,),;但若指定一个通配,IP,地址,则直到套接字已连接(,TCP,)或数据报已在套接字上发出(,UDP,),内核才选择一个本地,IP,地址。,bind,函数的用法,struct,sockaddr_in,addr,;,int,port=1234;,int,opt=SO_REUSEADDR;,setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt,);,bzero(&server,sizeof(server,);,addr.sin_family,=AF_INET;,addr.sin_addr.s_addr,=,htonl(INADDR_ANY,);,addr.sin_port,=,htons(port,);,if(,bind(fd,(,struct,sockaddr,*)&,addr,sizeof(addr,)=-1),/*,错误处理*,/,基本套接字函数,listen,#include,int,listen(int,sockfd,int,backlog),返回:,0,成功;,-1,出错并置,errno,值;,函数,listen,仅被服务器调用,它完成两件事情:,函数,listen,将未连接的套接字转化成被动套接字,指示内核应接受指向此套接字的连接请求;,函数的第二个参数规定了内核为此套接字排队的最大连接个数;,对于给定的监听套接字,内核要维护两个队列,未完成连接队列,已完成连接队列,两个队列之和不超过,backlog;,客户,服务器,Connect,调用,在未完成队列建立条目,SYN J,SYN K,ack,J+1,ack,K+1,该条目从未完成队列移至已完成队列,,accept,阻塞,Connect,返回,TCP,三路握手和监听套接口的两个队列,listen,函数(续),三路握手完成,两队列之和不能,超过,backlog,已完成连接队列,(ESTABLISHED,状态,),未完成连接队列,(SYN_RCVD,状态,),新到达的,SYN,分节,服务器,TCP,accept,TCP,为监听套接口维护的两个队列,listen,函数(续),另外几点说明:,不同的实现对,backlog,有不同的解释,如源自,Berkeley,的实现将,backlog,增加一个模糊因子,把它乘以,1.5,,再作为两个队列之和;,不要把,backlog,定义为,0,,因为有些实现允许,1,个连接排队,而有些实现不允许有连接排队;,当一个客户,SYN,到达时,若两个队列都是满的,,tcp,就忽略此分节,且不发送,RST,。,这是因为,这种情况是暂时的,客户,tcp,将重发,SYN,,,期望不久的将来就能在队列中找到空闲条目。,如果发送,RST,,,将会出现?,基本套接字函数,connect,#include,int,connect(int,sockfd,const struct sockaddr*,addr,socklen_t,addrlen,);,返回:,0,成功;,-1,出错;,函数,connect,激发,TCP,的三路握手过程;仅在成功或出错返回;错误有以下几种情况:,如果客户没有收到,SYN,分节的响应(总共,75,秒,这之间需要可能需要重发若干次,SYN,),,则返回,ETIMEDOUT,。,如果对客户的,SYN,的响应是,RST,,,则表明该服务器主机在指定的端口上没有进程在等待与之相连。函数返回错误,ECONNREFUSED,;,如果客户发出的,SYN,在中间路由器上引发一个目的地不可达,ICMP,错误,客户上的内核保存此消息,并按第一种情况,连续发送,SYN,,,直到规定时间,返回保存的消息(即,ICMP,错误)作为,EHOSTUNREACH,或,ENETUNREACH,错误返回给进程。,基本套接字函数,accept,#include,int,accept(int,sockfd,struct sockaddr*,cliaddr,socklen_t,*,addrlen,);,返回:非负描述字(,connfd,),OK,;,-1,出错;,accept,函数由,TCP,服务器调用;从已完成连接队列头返回下一个已完成连接;如果该队列空,则进程进入睡眠状态。,函数返回的套接字为已,连接套接字,,应与监听套接字区分开来,该函数最多,返回三个值,:一个既可能是新套接字也可能是错误指示的整数,一个客户进程的协议地址(由,cliaddr,所指),以及该地址的大小(这后两个参数是值结果参数);也就是说,服务器可以通过参数,cliaddr,来得到请求连接并获得成功的客户的地址和端口号;,基本套接字函数,close,#include,int,close(int,sockfd);,返回,:0,OK,;,-1,出错;,close,函数缺省功能是将套接字做上“已关闭”标记,并立即返回到进程。这个套接字不能再为该进程所用。,正常情况下,,close,将引发向,TCP,的四分节终止序列,但在终止前将发送已排队的数据;,如果套接字描述符访问计数在调用,close,后大于,0,(在多个进程共享同一个套接字的情况下),则不会引发,TCP,终止序列(即不会发送,FIN,分节);,基本套接字函数,-shutdown,#include,int,shutdown(int,sockfd,int,howto,);,返回,:0,OK,;,-1,出错,并置相应的,errno,的值;,该函数立即发送,FIN,分节(无论其访问计数是否大于,0,)。,shutdown,根据参数,howto,关闭指定方向的数据传输;,SHUT_RD,:,关闭连接的读这一半,不再接收套接字中的数据且现留在接收缓冲区的数据作废;,SHUT_WR,:,关闭连接的写这一半(半关闭),当留在套接字发送缓冲区中的数据都被发送,后跟,tcp,连接终止序列,不管访问计数是否大于,0,;此后将不能在执行对套接字的任何写操作;,SHUT_RDWR,:,连接的读、写都关闭,这等效于调用,shutdown,两次,一次调用是用,SHUT_RD,,,第二次用,SHUT_WR,。,数据,数据,FIN,数据和,FIN,的确认,数据,数据,FIN,数据和,FIN,的确认,write,write,shutdown,Read,返回大于,0,Read,返回大于,0,Read,返回,0,write,write,close,Read,返回大于,0,Read,返回,0,Read,返回大于,0,客户,服务器,调用,shutdown,关闭一半,TCP,连接,基本套接字函数,read,#include,int,read(int,fd,char*,buf,int,len,);,返回,:,大于,0,读写字节大小;,-1,出错;,调用函数,read,时,有如下几种情况:,套接字接收缓冲区接收数据,返回接收到的字节数;,tcp,协议收到,FIN,数据,返回,0,;,tcp,协议收到,RST,数据,返回,1,,同时,errno,为,ECONNRESET,;,进程阻塞过程中接收到信号,返回,1,,同时,errno,为,EINTR,。,read,(,connfd,,,buff,,,strlen,(,buff,),;,基本套接字函数,write,#include,int,write(int,fd,char*,buf,int,len,);,返回,:,大于,0,读写字节大小;,-1,出错;,调用函数,write,,,有如下几种情况:,套接字发送缓冲区有足够空间,返回发送的字节数;,tcp,协议接收到,RST,数据,返回,1,,同时,errno,为,ECONNRESET,;,进程阻塞过程中接收到信号,返回,1,,同时,errno,为,EINTR,。,write,(,connfd,,,buff,,,strlen,(,buff,),;,数据传输函数,send,#include,#include,ssize_t,send(,int,fd,const void*,msg,size_t,len,int,flags);,返回:非,0,发送成功的数据长度,;,-1,出错;,flags,是传输控制标志,其值定义如下:,0,:常规操作,如同,write(),函数,MSG_OOB,,,发送带外数据,(TCP,紧急数据,),。,MSG_DONTROUTE,:,忽略底层协议的路由设置,只能将数据发送给与发送机处在同一个网络中的机器上。,数据传输函数,recv,#include,#include,ssize_t,recv(int,fd,void*,buf,size_t,len,int,flags);,返回:大于,0,表示成功接收的数据长度;,0:,对方已关闭,,-1:,出错。,flags,是传输控制标志,其值定义如下:,0,:常规操作,如同,read(),函数;,MSG_PEEK,:,只查看数据而不读出数据,后续读操作仍然能读出所查看的该数据;,MSG_OOB,:,忽略常规数据,而只读带外数据;,MSG_WAITALL,:,recv,函数只有在将接收缓冲区填满后才返回。,TCP,套接字编程,实现,TCP,套接字基本步骤分为服务器端和客户端两部分:,服务器端,创建套接字;,绑定套接字;,设置套接字为监听模式,进入被动接受连接状态;,接受请求,建立连接,读写数据,终止连接,TCP,套接字编程(,cont.,),客户端步骤,创建套接字,与远程服务器建立连接,读,/,写数据;,终止连接,TCP,服务器模板,int,main(void),int,sockfd,connect_sock,;,if(sockfd,=socket(AF_INET,SOCK_STREAM,0)=-1),perror(“create,socket failed.”);,exit(-1);,/*bind sockfd to some address*/,/*listen*/,loop ,if(connect_sock,=,accept(sockfd,NULL,NULL,)=-1),perror(“Accept,error.”);,exit(-1);,/*read and process request*/,close(connect_sock);,close(sockfd,);,TCP,客户模板,/*include some header files*/,int,main(void),int,sockfd;,if(sockfd,=socket(AF_INET,SOCK_STREAM,0)=-1),perror(“Create,socket failed.”);,exit(-1);,/*connect to server*/,/*send,requst,and receive response*/,close(sockfd,);,TCP,套接字例程,采用客户,/,服务器模式,完成下列功能:,客户根据用户提供的,IP,地址,连接相应的服务器;,服务器等待客户的连接,一旦连接成功,则显示客户的,IP,地址,并发欢迎信息给客户;,客户接收服务器发送的信息并显示;,三种异常情况,下面我们考虑在以下三种异常情况发生后,,tcp,客户服务器程序的反映;,服务器主机崩溃,服务器主机崩溃后重启,服务器主机关机。,服务器主机崩溃,服务器主机崩溃时,已有的网络连接上发不出任何东西。,同时假设应用程序发出数据后,然后阻塞于从套接字读取响应。,由于服务器主机崩溃,因此客户,tcp,会持续重传数据分节,试图从服务器接收一个,ACK,:,源自,Berkeley,的实现将重传,12,次。当客户,tcp,最终放弃时,返回给客户一个错误,此时错误是,ETIMEDOUT,,,或者是因为中间路由器判定服务器主机不可达,且以一个目的地不可达的,ICMP,消息响应,则错误是,EHOSTUNREACH,或,ENETUNREACH,。,通过设置套接字选项可以更改,tcp,持续重传等待的超时时间。,服务器主机崩溃后重启,在这种情况下,如果客户在主机崩溃重启前不主动发送数据,那么客户是不会知道服务器已崩溃的。在服务器重启后,客户向服务器发送一个数据分节;,由于服务器重启后丢失了以前的连接信息(尽管在服务端口上有进程监听,但连接套接字所在的端口无进程等待),因此导致服务器主机的,tcp,响应,RST,;,当客户,tcp,收到,RST,,,向客户返回错误,,ECONNRESET,如果客户对服务器的崩溃情况很关心,即使客户不主动发送数据也这样,就需要其他技术支持(如套接口选项,SO_KEEPALIVE,或某些客户服务器心跳函数)。,服务器主机关机,当,Linux,主机关机时,由,init,进程给所有运行的进程发信号,SIGTERM,(,我们的服务器程序可以捕获该信号,并在信号处理程序中正常关闭网络连接)。,如果服务器程序忽略了,SIGTERM,信号,,则,init,进程会等待一段固定的时间(通常,是,5s20s,),,然后给所有还在运行的程序发信号,SIGKILL,(,该信号不能由服务器程序捕获);服务器将由信号,SIGKILL,终止,其终止时,所有打开的描述字被关闭,这导致向客户发送,FIN,分节;,客户收到,FIN,分节后,能推断出服务器将终止服务。,
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:第03章+基本TCP套接口编程.ppt
    链接地址:https://www.zixin.com.cn/doc/13220949.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork