第7章TCP网络编程基础

上传人:cl****1 文档编号:568029781 上传时间:2024-07-23 格式:PPT 页数:37 大小:593KB
返回 下载 相关 举报
第7章TCP网络编程基础_第1页
第1页 / 共37页
第7章TCP网络编程基础_第2页
第2页 / 共37页
第7章TCP网络编程基础_第3页
第3页 / 共37页
第7章TCP网络编程基础_第4页
第4页 / 共37页
第7章TCP网络编程基础_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《第7章TCP网络编程基础》由会员分享,可在线阅读,更多相关《第7章TCP网络编程基础(37页珍藏版)》请在金锄头文库上搜索。

1、第第7 7章章 TCP TCP网络编程基础网络编程基础TCP协议是协议是TCP/IP协议中很重要的一个协议,它由于协议中很重要的一个协议,它由于传输的稳定性,在很多程序中都在使用,例如传输的稳定性,在很多程序中都在使用,例如HTTP、FTP等协议都是在等协议都是在TCP的基础上进行构建的。本章介绍的基础上进行构建的。本章介绍TCP套接套接字的编程基础知识,主要包含如下内容:字的编程基础知识,主要包含如下内容:套接字编程的基础知识的部分,介绍套接字编程中经常套接字编程的基础知识的部分,介绍套接字编程中经常使用的套接字地址结构,对内核和应用层之间的内存数据传使用的套接字地址结构,对内核和应用层之间

2、的内存数据传递方式进行了简单的介绍。递方式进行了简单的介绍。TCP网络编程的流程部分,简单介绍网络编程的流程部分,简单介绍TCP套接字服务器、套接字服务器、客户端的编程框架,对函数客户端的编程框架,对函数socket()、bind()、listen()、accept()、connect()、close()函数进行了介绍,并提及如何使用函数进行了介绍,并提及如何使用read()和和write()函数进行数据的读取和发送。函数进行数据的读取和发送。宏槛黄录腺平椅撬蹋贺讣井瘟代震诚埃十见淬蚤雪挡阀摔禁杠躯蜡耳阂靳第7章TCP网络编程基础第7章TCP网络编程基础7.1 7.1 套接字编程基础知识套接字

3、编程基础知识在进行套接字编程之前需要对基本的数据结构有所了解。在进行套接字编程之前需要对基本的数据结构有所了解。本节对套接字的地址结构定义的形式、如何使用套接字的地本节对套接字的地址结构定义的形式、如何使用套接字的地址结构进行详细的介绍,并且对址结构进行详细的介绍,并且对Linux操作系统中用户空间操作系统中用户空间和用户空间之间的交互过程进行简单的介绍,用户对网络程和用户空间之间的交互过程进行简单的介绍,用户对网络程序设计的方法有比较深入的了解。序设计的方法有比较深入的了解。猫活惺垫栽耸禄爸顶瑚沫荒菱桶席僚留铅悦悍迂鞭债默蒂隙荷烂硝楷它臻第7章TCP网络编程基础第7章TCP网络编程基础7.1

4、.1 7.1.1 套接字地址结构套接字地址结构进行套接字编程需要指定套接字的地址作为参数,不同进行套接字编程需要指定套接字的地址作为参数,不同的协议族有不同的地址结构定义方式。这些地址结构通常以的协议族有不同的地址结构定义方式。这些地址结构通常以sockaddr_开头,每一个协议族有一个唯一的后缀,例如对开头,每一个协议族有一个唯一的后缀,例如对于以太网,其结构名称为于以太网,其结构名称为sockaddr_in。1通用套接字数据结构通用套接字数据结构2实际使用的套接字数据结构实际使用的套接字数据结构3结构结构sockaddr和结构和结构sockaddr_in的关系的关系唇爸他孰希傍耻良粉背敬怠

5、枚骸汁坯驶泡爹帘政炼牢化陋炸真厉盯程诉羞第7章TCP网络编程基础第7章TCP网络编程基础7.1.1 7.1.1 套接字地址结构套接字地址结构锚豁畴陡否郝熙渠肢膨诽遵亿卢邀潞疯谓柑侧轴莹楼岛扩呢碟垄疵瘴迹婪第7章TCP网络编程基础第7章TCP网络编程基础7.1.2 7.1.2 用户层和内核层交互过程用户层和内核层交互过程套接字参数中有部分参数是需要用户传入的,这些参数套接字参数中有部分参数是需要用户传入的,这些参数用来与用来与Linux内核进行通信,例如指向地址结构的指针。通内核进行通信,例如指向地址结构的指针。通常是采用内存复制的方法进行。例如常是采用内存复制的方法进行。例如bind()函数需

6、要传入地函数需要传入地址结构址结构struct sockaddr *my_addr和和my_addr指向参数的指向参数的长度。长度。1向内核传入数据的交互过程向内核传入数据的交互过程2内核传出数据的交互过程内核传出数据的交互过程俊发导衔瘪匝酋令鲁嚏留档绘奉抛诀惠送噎淡迹呕丙赖斋艾嫁闲饮颓贷滞第7章TCP网络编程基础第7章TCP网络编程基础7.1.2 7.1.2 用户层和内核层交互过程用户层和内核层交互过程摸郭耕掷沧氯今房键忧品溶也弱厘崩钵悉屯包多叉访丁纹抄苍怨抠常睛绽第7章TCP网络编程基础第7章TCP网络编程基础7.2 TCP7.2 TCP网络编程流程网络编程流程TCP网络编程是目前比较通用

7、的方式,例如网络编程是目前比较通用的方式,例如HTTP协议、协议、FTP协议等很多广泛应用的协议均基于协议等很多广泛应用的协议均基于TCP协议。协议。TCP编程编程主要为主要为C/S模式,即服务器(模式,即服务器(S)、客户端()、客户端(C)模式。)模式。TCP网络编程的流程包含服务器和客户端两种模式,这两种模式网络编程的流程包含服务器和客户端两种模式,这两种模式之间的程序设计的流程存在很大的差别。之间的程序设计的流程存在很大的差别。努胶伯秋主呼恶廖辟怠甚阂兑涩奎泉湾法棒折懈懂唬秤汾卒征溯翌从耐漫第7章TCP网络编程基础第7章TCP网络编程基础7.2.1 TCP7.2.1 TCP网络编程架构

8、网络编程架构TCP网络编程有两种模式,一种是服务器模式,另一种网络编程有两种模式,一种是服务器模式,另一种是客户端模式。服务器模式创建一个服务程序,等待客户端是客户端模式。服务器模式创建一个服务程序,等待客户端用户的连接,接收到用户的连接请求后,根据用户的请求进用户的连接,接收到用户的连接请求后,根据用户的请求进行处理;客户端模式则根据目的服务器的地址和端口进行连行处理;客户端模式则根据目的服务器的地址和端口进行连接,向服务器发送请求并对服务器的响应进行数据处理。接,向服务器发送请求并对服务器的响应进行数据处理。1服务器端的程序设计模式服务器端的程序设计模式2客户端的程序设计模式客户端的程序设

9、计模式3客户端与服务器的交互过程客户端与服务器的交互过程集凳柿庐市放瞳弓联贞醉奉痹钩纹蠢习旬榆翌雕橙途枣屈称泥笆志垃春竟第7章TCP网络编程基础第7章TCP网络编程基础7.2.1 TCP7.2.1 TCP网络编程架构网络编程架构狂侵憨喉宫涩午充上请煎协镀吨歌腆蔑彬汤卵突镀滨实搞密首辙碧莉脏峭第7章TCP网络编程基础第7章TCP网络编程基础7.2.2 7.2.2 创建网络插口函数创建网络插口函数socket()socket()网络程序设计中的套接字系统调用函数网络程序设计中的套接字系统调用函数socket()用来获得文用来获得文件描述符。件描述符。1函数函数socket()介绍介绍2应用层函数应

10、用层函数socket()和内核函数之间的关系和内核函数之间的关系名称含义PF_UNIX,PF_LOCAL本地通信PF_INETIPv4Internet协议PF_INET6IPv6Internet协议PF_IPXIPX-Novell协议PF_NETLINK内核用户界面设备PF_X25ITU-TX.25/ISO-8208协议PF_AX25AmateurradioAX.25协议PF_ATMPVC原始ATMPVC访问PF_APPLETALKAppletalkPF_PACKET底层包访问黎渗潭准癌菠迫掣旺狙花个优压再钎酸坠烘宁瘫茸啮弛景蝶绩房配笨垮咳第7章TCP网络编程基础第7章TCP网络编程基础7.2

11、.2 7.2.2 创建网络插口函数创建网络插口函数socket()socket()芒掘另座撩歇密例坏渔萝唾眠驮瘫三喜澄贫氛樊您华姻讥卑艳烛荤块呈还第7章TCP网络编程基础第7章TCP网络编程基础7.2.3 7.2.3 绑定一个地址端口对绑定一个地址端口对bind()bind()在建立套接字文件描述符成功后,需要对套接字进行地址和端口在建立套接字文件描述符成功后,需要对套接字进行地址和端口的绑定,才能进行数据的接收和发送操作。的绑定,才能进行数据的接收和发送操作。1函数函数bind()介绍介绍2函数函数bind()的例子的例子3应用层应用层bind()函数和内核函数之间的关系函数和内核函数之间的

12、关系值含义备注EADDRINUSE给定地址已经使用EBADFsockfd不合法EINVALsockfd已经绑定到其他地址ENOTSOCKsockfd是一个文件描述符,不是socket描述符EACCES地址被保护,用户的权限不足EADDRNOTAVAIL接口不存在或者绑定地址不是本地UNIX协议族,AF_UNIXEFAULTmy_addr指针超出用户空间UNIX协议族,AF_UNIXEINVAL地址长度错误,或者socket不是AF_UNIX族UNIX协议族,AF_UNIXELOOP解析my_addr是符号链接过多UNIX协议族,AF_UNIXENAMETOOLONGmy_addr过长UNIX协

13、议族,AF_UNIXENOENT文件不存在UNIX协议族,AF_UNIXENOMEM内存内核不足UNIX协议族,AF_UNIXENOTDIR不是目录UNIX协议族,AF_UNIXEROFSsocket节点应该在只读文件系统上UNIX协议族,AF_UNIX晤技坯力崩凭撮脚蓄罐凳淡傅缝仪面夜匪险九三敌齿窝例指港悼瞬忱誊杠第7章TCP网络编程基础第7章TCP网络编程基础7.2.3 7.2.3 绑定一个地址端口对绑定一个地址端口对bind()bind()翌吗求裙吗悲架弊锣框炼欧凋呜茫数闲晒扶赵俱下屈哎迪窑沽粉坏蹄矗仙第7章TCP网络编程基础第7章TCP网络编程基础7.2.4 7.2.4 监听本地端口监

14、听本地端口listenlisten在在7.2.1小节中简单介绍了服务器模式的方式,服务器小节中简单介绍了服务器模式的方式,服务器模式中有模式中有listen()和和accept()两个函数,而客户端则不需要这两个函数,而客户端则不需要这两个函数。函数两个函数。函数listen()用来初始化服务器可连接队列,服用来初始化服务器可连接队列,服务器处理客户端连接请求的时候是顺序处理的,同一时间仅务器处理客户端连接请求的时候是顺序处理的,同一时间仅能处理一个客户端连接。当多个客户端的连接请求同时到来能处理一个客户端连接。当多个客户端的连接请求同时到来的时候,服务器并不是同时处理,而是讲不能进行处理的客

15、的时候,服务器并不是同时处理,而是讲不能进行处理的客户端连接请求放到等待队列中,这个队列的长度由户端连接请求放到等待队列中,这个队列的长度由listen()函数来定义。函数来定义。1函数函数listen()介绍介绍2函数函数listen()的例子的例子3应用层应用层listen()函数和内核函数之间的关系函数和内核函数之间的关系乏眷祖吭惋面敛石忆慢钝褪饥作范谅章芬谴猜纯磺沂珐普遗齐辉践命腥狙第7章TCP网络编程基础第7章TCP网络编程基础7.2.4 7.2.4 监听本地端口监听本地端口listenlisten值含义EADDRINUSE另一个socket已经在同一端口侦听EBADF参数sockf

16、d不是合法的描述符ENOTSOCK参数sockfd不是代表socket的文件描述符EOPNOTSUPPsocket不支持listen操作拉些碍戚施语嚼求阳累兢檄槽高通漆株奏瑟橙暗屯运更举调揍得距芭挣宰第7章TCP网络编程基础第7章TCP网络编程基础7.2.4 7.2.4 监听本地端口监听本地端口listenlisten懦以津哄小券冀港蓝棘哲朔绍均斥毛集珍青晌角逮逮播屡走顷肾嫩糟木色第7章TCP网络编程基础第7章TCP网络编程基础7.2.5 7.2.5 接受一个网络请求接受一个网络请求accept()accept()当一个客户端的连接请求到达服务器主机侦听的端口时,当一个客户端的连接请求到达服务

17、器主机侦听的端口时,此时客户端的连接会在队列中等待,直到使用服务器处理接此时客户端的连接会在队列中等待,直到使用服务器处理接收请求。收请求。函数函数accept()成功执行后,会返回一个新的套接口文件成功执行后,会返回一个新的套接口文件描述符来表示客户端的连接,客户端连接的信息可以通过这描述符来表示客户端的连接,客户端连接的信息可以通过这个新描述符来获得。因此当服务器成功处理客户端的请求连个新描述符来获得。因此当服务器成功处理客户端的请求连接后,会有两个文件描述符,老的文件描述符表示正在监听接后,会有两个文件描述符,老的文件描述符表示正在监听的的socket,新产生的文件描述符表示客户端的连接

18、,函数,新产生的文件描述符表示客户端的连接,函数send()和和recv()通过新的文件描述符进行数据收发。通过新的文件描述符进行数据收发。1函数函数accept()介绍介绍2函数函数accept()的例子的例子3应用层应用层accept()函数和内核函数之间的关系函数和内核函数之间的关系难爷拘卞秋嫌裴递凭免屉难模符硒证牺秘钓塌焦磋癌款煤荡轩厘拙闪绩洲第7章TCP网络编程基础第7章TCP网络编程基础7.2.5 7.2.5 接受一个网络请求接受一个网络请求accept()accept()咋酸涵柠称贰遂酌谐汕热谈偿帆鹃狼氓焰藻抿内词创牟久躺折找绞堑张强第7章TCP网络编程基础第7章TCP网络编程基

19、础7.2.6 7.2.6 连接目标网络服务器连接目标网络服务器connect()connect()客户端在建立套接字之后,不需要进行地址绑定,就可客户端在建立套接字之后,不需要进行地址绑定,就可以直接连接服务器。连接服务器的函数为以直接连接服务器。连接服务器的函数为connect(),此函,此函数连接指定参数的服务器,例如数连接指定参数的服务器,例如IP地址,端口等。地址,端口等。1函数函数connet()介绍介绍2函数函数connect的例子的例子3应用层应用层connect()函数和内核函数之间的关系函数和内核函数之间的关系益弦赣倪捎舅髓娜擅挛翔疙晴琼嚎珊凰庸捡塞瓮苹曲捕写贴任要披账蔗拷第

20、7章TCP网络编程基础第7章TCP网络编程基础7.2.6 7.2.6 连接目标网络服务器连接目标网络服务器connect()connect()值含义EACCES在AF_UNIX族协议中,使用路径名作为标识。EACCES表示目录不可写或者不可访问。EACCES/EPERM用户没有设置广播标志而连接广播地址或者连接请求被防火墙限制。EADDRINUSE本地地址已经在使用EAFNOSUPPORT参数serv_addr的域sa_family不正确EAGAIN本地端口不足EALREADYsocket是非阻塞类型并且前面的连接没有返回EBADF文件描述符不是合法的值ECONNREFUSED连接的主机地址没

21、有侦听EFAULTsocket结构地址超出用户空间EINPROGRESSsocket是非阻塞模式,而连接不能立刻返回EINTR函数被信号中断EISCONNsocket已经连接ENETUNREACH网络不可达ENOTSOCK文件描述符不是一个socketETIMEDOUT连接超时祖呸赘茅剃浴己掉泞巍颤埋辰刻岛宅半辆损俯亿贪贴抚讳琐韶海竭凄遥质第7章TCP网络编程基础第7章TCP网络编程基础7.2.6 7.2.6 连接目标网络服务器连接目标网络服务器connect()connect()殃仔蓄糕羞堤夯弹晨度洽蒙派住灰葛苫践粥固狞袋码韦徘窃以杨徽啄殉阑第7章TCP网络编程基础第7章TCP网络编程基础7

22、.2.7 7.2.7 写入数据写入数据write()write()如图如图7-5所示,当服务器端在接收到一个客户端的连接所示,当服务器端在接收到一个客户端的连接后,可以通过套接字描述符进行数据的写入操作。对套接字后,可以通过套接字描述符进行数据的写入操作。对套接字进行写入的形式和过程与普通文件的操作方式一致,内核会进行写入的形式和过程与普通文件的操作方式一致,内核会根据文件描述符的值来查找所对应的属性,当为套接字的时根据文件描述符的值来查找所对应的属性,当为套接字的时候,会调用相对应的内核函数。候,会调用相对应的内核函数。下面是一个向套接字文件描述符中写入数据的例子,将下面是一个向套接字文件描

23、述符中写入数据的例子,将缓冲区缓冲区data的数据全部写入套接字文件描述符的数据全部写入套接字文件描述符s中,返回值中,返回值为成功写入的数据长度。为成功写入的数据长度。int size ;char data1024;size = write(s, data, 1024);莹兜腋措托炭辐杠堂爪肉孰请吐园皑彻垦项局戴藩嫌载徒沃汤顺滥嫂溺易第7章TCP网络编程基础第7章TCP网络编程基础7.2.8 7.2.8 读取数据读取数据read()read()与写入数据类似,使用与写入数据类似,使用read()函数可以从套接字描述符函数可以从套接字描述符中读取数据。当然在读取数据之前,必须建立套接字并连接。

24、中读取数据。当然在读取数据之前,必须建立套接字并连接。读取数据的方式如下所示,从套接字描述符读取数据的方式如下所示,从套接字描述符s中读取中读取1024个个字节,放入缓冲区字节,放入缓冲区data中,中,size变量的值为成功读取的数据变量的值为成功读取的数据大小。大小。int size ;char data1024;size = read(s, data, 1024);密锅陪因叭帚恼唉耶熔浪挎浅城负猜壁犬积堡馏苹魁笋局该蹈钉合铰仁舒第7章TCP网络编程基础第7章TCP网络编程基础7.2.9 7.2.9 关闭套接字关闭套接字close()close()关闭关闭socket连接可以使用函数连接可

25、以使用函数close()实现,函数的作实现,函数的作用是关闭已经打开的用是关闭已经打开的socket连接,内核会释放相关的资源,连接,内核会释放相关的资源,关闭套接字之后不能使用这个套接字文件描述符进行读写操关闭套接字之后不能使用这个套接字文件描述符进行读写操作了。函数原型在第作了。函数原型在第3章中已经介绍过。章中已经介绍过。函数函数shutdown(),可以使用更多方式来关闭连接,允,可以使用更多方式来关闭连接,允许单方向切断通信或者切断双方的通信。函数原型如下,第许单方向切断通信或者切断双方的通信。函数原型如下,第一个参数一个参数s,此参数是切断通信的套接口文件描述符,第二,此参数是切断

26、通信的套接口文件描述符,第二个参数个参数how,此参数表示切断的方式。,此参数表示切断的方式。#include int shutdown(int s, int how);举术煮昔粗兑营举亩曹测鸽林屿赦馈疙贞诫酝锌鹤耻弹电雅郡宿狂屡做呵第7章TCP网络编程基础第7章TCP网络编程基础7.2.9 7.2.9 关闭套接字关闭套接字close()close()值含义EBADF文件描述符不是合法的值ENOTCONNsocket没有连接ENOTSOCKs是一个文件,不是socket。良悬殖啡测在匝昼竖皿诌砖料善笋删祈虐蛛晨腐冒啥噪歉汪桃介间磐旗偷第7章TCP网络编程基础第7章TCP网络编程基础7.3 7.

27、3 服务器服务器/ /客户端的简单例子客户端的简单例子前面几节对网络程序设计的函数进行了介绍,本节介绍前面几节对网络程序设计的函数进行了介绍,本节介绍一个简单的基于一个简单的基于TCP协议的服务器协议的服务器/客户端的例子,通过本客户端的例子,通过本例中代码和程序构建过程的了解,读者能够对基于例中代码和程序构建过程的了解,读者能够对基于TCP协议协议的服务器、客户端程序设计方法和过程有基本的了解,进一的服务器、客户端程序设计方法和过程有基本的了解,进一步能够编写自己的程序。步能够编写自己的程序。栋绩吨轰阶墟淋天铃属眩杀岛刻窖灭柴厉鸡子铆察根歌递止济片怒挣缝眷第7章TCP网络编程基础第7章TCP

28、网络编程基础7.3.1 7.3.1 例子功能描述例子功能描述例子程序分为服务器端和客户端,客户端连接服务器后例子程序分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器;服务器接收从标准输入读取输入的字符串,发送给服务器;服务器接收到字符串后,发送接收到的总字符串个数给客户端;客户端到字符串后,发送接收到的总字符串个数给客户端;客户端将接收到的服务器的信息打印到标准输出。将接收到的服务器的信息打印到标准输出。滁首鸽媚桐楞诸殖曹尖贫陪患坎穿苦胃谭很坡蹲牡竹躲剁言绵跪聋祸澜狠第7章TCP网络编程基础第7章TCP网络编程基础7.3.2 7.3.2 服务器网络程序服务器网络

29、程序程序的代码如下,程序按照网络流程建立套接字、初始程序的代码如下,程序按照网络流程建立套接字、初始化绑定网络地址、将套接字与网络地址绑定、设置侦听队列化绑定网络地址、将套接字与网络地址绑定、设置侦听队列长度、接收客户端连接、收发数据、关闭套接字。长度、接收客户端连接、收发数据、关闭套接字。1初始化工作初始化工作2建立套接字建立套接字3设置服务器地址设置服务器地址4绑定地址到套接字描述符绑定地址到套接字描述符5设置侦听队列设置侦听队列6主循环过程主循环过程随珍村匀雏琵汤紊掂奥吼珐梆芯捷振俭牡允鞘讶乱蹈丢蛤五祸狂起毯在呈第7章TCP网络编程基础第7章TCP网络编程基础7.3.3 7.3.3 服务

30、器读取和显示字符串服务器读取和显示字符串服务器端对客户端连接的处理过程如下,先读取从客户服务器端对客户端连接的处理过程如下,先读取从客户端发送来的数据,然后将接收到的数据个数发送给客户端。端发送来的数据,然后将接收到的数据个数发送给客户端。void process_conn_server(int s)ssize_t size = 0;char buffer1024;for(;)size = read(s, buffer, 1024);if(size = 0)return;sprintf(buffer, %d bytes altogethern, size);write(s, buffer, s

31、trlen(buffer)+1); 搬暑杏你匙硼巨骤虽赐业乔眠失涂诺饯乃橇秽晶摄驹敏御浅嫩齐垂蒋疑昼第7章TCP网络编程基础第7章TCP网络编程基础7.3.4 7.3.4 客户端的网络程序客户端的网络程序客户端的程序十分简单,建立一个流式套接字后,将服客户端的程序十分简单,建立一个流式套接字后,将服务器的地址和端口绑定到套接字描述符上。然后连接服务器,务器的地址和端口绑定到套接字描述符上。然后连接服务器,进程处理。最后关闭连接。进程处理。最后关闭连接。簿睦敌防辽挫球冰堕冯涂蹄落骄碍绪臭师悲团胃围蔫阜古专罕颁庆疑扼浇第7章TCP网络编程基础第7章TCP网络编程基础7.3.5 7.3.5 客户端读

32、取和显示字符串客户端读取和显示字符串客户端从标准输入读取数据到缓冲区客户端从标准输入读取数据到缓冲区buffer中,发送到中,发送到服务器端。然后从服务器端读取服务器的响应,将数据发送服务器端。然后从服务器端读取服务器的响应,将数据发送到标准输出。到标准输出。void process_conn_client(int s)ssize_t size = 0;char buffer1024;for(;)size = read(0, buffer, 1024);if(size 0)write(s, buffer, size);size = read(s, buffer, 1024);write(1,

33、buffer, size);刹提更裕彪蔽戚枫莫驰朵树峪露痪阁蕴量惨肮铭蔡狄耳劝驭镶钓碾谢泥弯第7章TCP网络编程基础第7章TCP网络编程基础7.3.6 7.3.6 编译运行程序编译运行程序服务器的网络程序保存为文件服务器的网络程序保存为文件tcp_server.c、客户端的、客户端的网络程序保存为网络程序保存为tcp_client.c、客户端和服务器的字符串处、客户端和服务器的字符串处理保存为文件理保存为文件tcp_proccess.c,建立如下的,建立如下的Makefile文件:文件:all:client serverclient:tcp_process.o tcp_client.ogcc

34、-o client tcp_process.o tcp_client.oserver:tcp_process.o tcp_server.ogcc -o server tcp_process.o tcp_server.oclean:rm -f client server *.o前篇阁升愁党蚀下涎涩刊车加泻替碗噶育芝湾涅作弃菇八摹壁既沉相材毫第7章TCP网络编程基础第7章TCP网络编程基础7.4 7.4 截取信号的例子截取信号的例子在在Linux操作系统中当某些状况发送变化时,系统会向操作系统中当某些状况发送变化时,系统会向相关的进程发送信号。信号的处理方式系统会先调用进程中相关的进程发送信号。信

35、号的处理方式系统会先调用进程中注册的处理函数,然后调用系统的默认地响应方式,包括终注册的处理函数,然后调用系统的默认地响应方式,包括终止进程,因此在系统结束进程前注册信号处理函数进行一些止进程,因此在系统结束进程前注册信号处理函数进行一些处理是一个完善程序的必须条件。处理是一个完善程序的必须条件。陈捉诫垮熙忍藩拭谎汗圭挖碧盂骇十塑映主值碴汞醉裹噬吭逮蠢让或娱骡第7章TCP网络编程基础第7章TCP网络编程基础7.4.1 7.4.1 信号处理信号处理信号是发生某件事情的时候的一个通知,有时候也将其信号是发生某件事情的时候的一个通知,有时候也将其称为软中断。信号将事件发送给相关的进程,相关进程可以称

36、为软中断。信号将事件发送给相关的进程,相关进程可以对信号进行捕捉并进行处理。信号的捕捉由系统自动完成,对信号进行捕捉并进行处理。信号的捕捉由系统自动完成,信号的处理函数的注册通过函数信号的处理函数的注册通过函数signal()完成。函数完成。函数signal()的原型为:的原型为:#include typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);柑显竿棵钮杆呢劝棍诛谁贬闹琴瑟技加找翅纬雹哀线小维牲熊蔼联陛与褪第7章TCP网络编程基础第7章TCP网络编程基础7.4.2

37、7.4.2 信号信号SIGPIPESIGPIPE当正在写入套接字的时候,当读取端已经关闭的时候,当正在写入套接字的时候,当读取端已经关闭的时候,可以得到一个可以得到一个SIGPIPE信号。信号信号。信号SIGPIPE会终止当前进程,会终止当前进程,因为信号系统在调用系统默认处理方式的之前会先调用用户因为信号系统在调用系统默认处理方式的之前会先调用用户注册的函数,所以可以通过注册注册的函数,所以可以通过注册SIGPIPE信号的处理函数来信号的处理函数来获取这个信号,并进行相应的处理。获取这个信号,并进行相应的处理。亡迭狮秤剁羞蝶玉拓倚铝锣棚除尸级徽襟鸟竭豹效牙滞副蛹斩酌撂溜撰婴第7章TCP网络编

38、程基础第7章TCP网络编程基础7.4.3 7.4.3 信号信号SIGINTSIGINT信号信号SIGINT通常是由通常是由CTRL+C终止进程造成的,与终止进程造成的,与CTRL+C一致一致kill命令默认发送命令默认发送SIGINT信号,用于终止进程信号,用于终止进程运行向,当前活动的进程发送这个信号。运行向,当前活动的进程发送这个信号。void sig_int(int sign)printf(Catch a SIGINT signaln);signal(SIGINT, sig_pipe);磷恐取紧共寐钠殉役瓮梗沪曲力佬索戈筛制页选辫挖谣确琢饺衅痪总腔骆第7章TCP网络编程基础第7章TCP网

39、络编程基础7.5 7.5 小结小结本章介绍了本章介绍了TCP网络编程的基础知识,对函数网络编程的基础知识,对函数socket()、bind()、listen()、accept()、connect()、close()进行了进行了介绍。服务器端和客户端的程序中用到不同的函数,并且二介绍。服务器端和客户端的程序中用到不同的函数,并且二者之间的流程存在差别。其中服务器端的程序设计需要依次者之间的流程存在差别。其中服务器端的程序设计需要依次调用调用socket()、bind()、listen()、accept()、close()函数,函数,客户端程序设计需要依次调用客户端程序设计需要依次调用socket()、connect()、close()等函数。等函数。通过一个例子对服务器和客户端的流程和函数的使用进通过一个例子对服务器和客户端的流程和函数的使用进行了解释。最后提及网络编程中的信号处理,特别是由于连行了解释。最后提及网络编程中的信号处理,特别是由于连接关闭造成的接关闭造成的SIGPIPE信号和由于要终止进程而造成的信号和由于要终止进程而造成的SIGINT信号。截取退出信号进行处理是程序稳定性的基本信号。截取退出信号进行处理是程序稳定性的基本要求。要求。恼垫呜固沃鹊紫键衬敛沤请锥州莱戎沤翰卢唬紫乳县黎注瞥鸭赋桌我韶敝第7章TCP网络编程基础第7章TCP网络编程基础

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

最新文档


当前位置:首页 > 资格认证/考试 > 自考

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