最新Linux套接字网络编程接口(共252张PPT课件).pptx

上传人:豆**** 文档编号:27188130 上传时间:2022-07-23 格式:PPTX 页数:252 大小:2.10MB
返回 下载 相关 举报
最新Linux套接字网络编程接口(共252张PPT课件).pptx_第1页
第1页 / 共252页
最新Linux套接字网络编程接口(共252张PPT课件).pptx_第2页
第2页 / 共252页
点击查看更多>>
资源描述

《最新Linux套接字网络编程接口(共252张PPT课件).pptx》由会员分享,可在线阅读,更多相关《最新Linux套接字网络编程接口(共252张PPT课件).pptx(252页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第5章章 Linux套接字网络套接字网络(wnglu)编程接口编程接口第一页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()第第5章章 Linux套接字网络套接字网络(wnglu)编程接口编程接口l网络编程接口的产生与发展网络编程接口的产生与发展l套接字基础套接字基础l面向连接面向连接(linji)(linji)的传输层套接字的传输层套接字编程编程l无连接的套接字编程无连接的套接字编程l高级套接字函数高级套接字函数l服务器的服务器的I/O模型模型l网络层的原始套接字网络层的原始套接字l面向数据链路层的套接字面向数据链路层的套接字第二页,共二百五十二页

2、。网络编程接口网络编程接口(ji ku)产生与发展产生与发展第三页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()网络网络(wnglu)编程接口的产生与发展编程接口的产生与发展l问题的提出问题的提出站在应用程序实现的角度,应用程序如何方便地站在应用程序实现的角度,应用程序如何方便地使用协议栈软件进行使用协议栈软件进行(jnxng)通信呢?通信呢?如果能在应用程序与协议栈软件之间提供一个软如果能在应用程序与协议栈软件之间提供一个软件接口,就可以方便客户与服务器软件的编程。件接口,就可以方便客户与服务器软件的编程。第四页,共二百五十二页。中国地质大学中国地

3、质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()网络编程接口的产生网络编程接口的产生(chnshng)与发展与发展l套接字编程接口套接字编程接口套接字应用程序编程接口是网络应用程序通过网套接字应用程序编程接口是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口与协议栈软件之间的接口,简称套接字编程接口(Socket API)。它定义了应用程序与协议栈软件进行交互时可以它定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的使用的一组操作,决定了应用程序使用协议栈的方式

4、、应用程序所能实现的功能、以及开发具有方式、应用程序所能实现的功能、以及开发具有这些这些(zhxi)功能的程序的难度。功能的程序的难度。第五页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()网络网络(wnglu)编程接口的产生与发展编程接口的产生与发展l Socket 的历史的历史 在在80 年代早期,远景研究规划局(年代早期,远景研究规划局(Advanced Research Projects Agency, ARPA)资助了佳利福尼亚大学伯克利分校的一个研究组,让他们将)资助了佳利福尼亚大学伯克利分校的一个研究组,让他们将TCP/IP 软件移植到软

5、件移植到UNIX 操作系统中,并将结果提供给其他网点。操作系统中,并将结果提供给其他网点。 作为项目的一部分,设计者们创建了一个接口,应用进程使用这个接作为项目的一部分,设计者们创建了一个接口,应用进程使用这个接口可以方便的进行口可以方便的进行(jnxng)通信。他们决定,只要有可能就使用以有的通信。他们决定,只要有可能就使用以有的系统调用,对那些不能方便的容入已有的函数集的情况,就再增加新系统调用,对那些不能方便的容入已有的函数集的情况,就再增加新的系统调用以支持的系统调用以支持TCP/IP 功能。功能。 这样做的结果就出现了插口接口(这样做的结果就出现了插口接口(Berkeley Sock

6、et),这个系统被称为),这个系统被称为Berkeley UNIX或或BSD UNIX。(TCP/IP 首次出现在首次出现在BSD 4.1 版本版本release 4.1 of Berkeley SoftwareDistribution)。 由许多计算机厂商,都采用了由许多计算机厂商,都采用了Berkeley UNIX,于是许多机器上都可以使,于是许多机器上都可以使用用Socket 了。这样,了。这样,Socket 接口就被广泛使用,到现在已经成为事实上的标接口就被广泛使用,到现在已经成为事实上的标准。准。第六页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾

7、卫华()网络编程接口网络编程接口(ji ku)的产生与发展的产生与发展l要想实现套接字编程接口,可以采用两种实要想实现套接字编程接口,可以采用两种实现方式现方式:一种是在操作系统的内核中增加一种是在操作系统的内核中增加(zngji)相应的软件相应的软件来实现,来实现,一种是通过开发操作系统之外的函数库来实现。一种是通过开发操作系统之外的函数库来实现。 第七页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()网络编程接口的产生网络编程接口的产生(chnshng)与发展与发展lLinux系统是通过提供系统是通过提供(tgng)套接字套接字(socket)来进

8、来进行网络编程的行网络编程的.lSocket技术提供了在技术提供了在TCP/IP模型各个层上的模型各个层上的编程支持。编程支持。l该技术是在内核处理收到的各层协议数据,该技术是在内核处理收到的各层协议数据,然后应用程序以文件的方式接受内核传来的然后应用程序以文件的方式接受内核传来的数据。数据。l应用程序的文件处理是通过一个文件句柄来应用程序的文件处理是通过一个文件句柄来进行的。进行的。第八页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()网络编程接口的产生网络编程接口的产生(chnshng)与发展与发展l网络程序通过网络程序通过socket和其它几个函

9、数的调用和其它几个函数的调用(dioyng),会返回一个会返回一个 通讯的文件描述符通讯的文件描述符,l我们可以将这个描述符看成普通的文件的描我们可以将这个描述符看成普通的文件的描述符来操作述符来操作,l这就是这就是linux的设备无关性的好处的设备无关性的好处.我们可以通我们可以通过向描述符读写操作实现网络之间的数据交过向描述符读写操作实现网络之间的数据交流流. 第九页,共二百五十二页。套接字基础套接字基础(jch)第十页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l 什么是套接字(什么是套接字(SOCKET)l 套

10、接口是对网络中不同主机上应用进程之间进行双向通信套接口是对网络中不同主机上应用进程之间进行双向通信(tng xn)的端点的抽象,一个套接口就是网络上进程通信的端点的抽象,一个套接口就是网络上进程通信(tng xn)的一端,提供了应用层进程利用网络协议栈交换数据的的一端,提供了应用层进程利用网络协议栈交换数据的机制机制。第十一页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l Socket Socket 的功能的功能 Socket 的英文原意就是的英文原意就是“孔孔”或或“插座插座”,将电话系统与面向连接的,将电话系统与面

11、向连接的Socket 机制相机制相比,有着惊人相似的地方。以一个国家级的电话网为例。比,有着惊人相似的地方。以一个国家级的电话网为例。 电话的通话双方相当于相互通信的两个进程;通话双方所在的地区(享有电话的通话双方相当于相互通信的两个进程;通话双方所在的地区(享有一个全局唯一的区号)相当于一个网络,区号是它的网络地址;区内的一一个全局唯一的区号)相当于一个网络,区号是它的网络地址;区内的一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket 号号. . 任何用户在通话之前,首先要占有任何用户在通话之前,首先

12、要占有(zhnyu)(zhnyu)一部电话机,相当于申请一个一部电话机,相当于申请一个Socket 号;同时要知道对方的电话号码,相当于对方有一个号;同时要知道对方的电话号码,相当于对方有一个Socket。 然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。且可以接受连接请求),拿起电话话

13、筒,双方就可以正式通话,相当于连接成功。 双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向于向Socket 发送数据和从发送数据和从Socket 接受数据。通话结束后,一方挂起电话机,接受数据。通话结束后,一方挂起电话机,相当于关闭相当于关闭Socket,撤消连接。,撤消连接。第十二页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l 我们应当从多个层面来理解套接字这个概念的内涵我们应当从多个层面来理解套接字这个概念的内涵(nihn)。l

14、从套接字所处的地位来讲,套接字上联应用进程,下联网络从套接字所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应协议栈,是应用程序通过网络协议栈进行通信的接口,是应用程序与网络协议栈进行交互的接口。用程序与网络协议栈进行交互的接口。 第十三页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l从实现的角度来讲,非常复杂。从实现的角度来讲,非常复杂。套接字是一个复杂的软件套接字是一个复杂的软件(run jin)机构,包含了一机构,包含了一定的数据结构,包含许多选项,由操作系统内核定的

15、数据结构,包含许多选项,由操作系统内核管理。管理。l从使用的角度来讲,非常简单。从使用的角度来讲,非常简单。对于套接字的操作形成了一种网络应用程序的编对于套接字的操作形成了一种网络应用程序的编程接口(程接口(API)。)。l本书把这一套操作套接字的编程接口函数称本书把这一套操作套接字的编程接口函数称作套接字编程接口,套接字是它的操作对象。作套接字编程接口,套接字是它的操作对象。l总之,套接字是网络通信的基石。总之,套接字是网络通信的基石。第十四页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l 常用的常用的socket:

16、流式套接字:流式套接字:u它提供它提供(tgng)基于基于TCP协议的双向、可靠、有序且不重协议的双向、可靠、有序且不重复的无记录边界的数据流。复的无记录边界的数据流。 数据报套接字:数据报套接字:u它提供基于它提供基于UDP协议的双向数据流,但不一定可靠、协议的双向数据流,但不一定可靠、有序和不重复。有序和不重复。 原始套接字:原始套接字:u它提供网络下层通信协议的直接访问。一般用于开发它提供网络下层通信协议的直接访问。一般用于开发新的网络层协议,如新的新的网络层协议,如新的IP协议等。协议等。第十五页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()

17、套接字基础套接字基础(jch)第十六页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)第十七页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字使用套接字使用(shyng)的数据类型和相关的问题的数据类型和相关的问题l1三种表示套接字地址三种表示套接字地址(dzh)的结构的结构在套接字编程接口中,专门定义了三种结构型的在套接字编程接口中,专门定义了三种结构型的数据类型,用来存储协议相关的网络地址,在套数据类型,用来存储协议相关的网络地址,在套接字编程接口的函数调用中要用到它们。

18、接字编程接口的函数调用中要用到它们。第十八页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l(1)struct sockaddr这个结构用来这个结构用来(yn li)存储套接字地址。存储套接字地址。数据定义:数据定义:struct sockaddr unsigned short sa_family; /* address族族, AF_xxx */char sa_data14; /* 14 bytes的协议地址的协议地址*/;sa_family 一般来说,都是一般来说,都是“AF_INET”。sa_data 包含了一些远程

19、电脑的地址、端口和套包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一切的。接字的数目,它里面的数据是杂溶在一切的。第十九页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l (2). (2). struct sockaddr_in为了处理为了处理struct sockaddr, 程序员建立了另外程序员建立了另外(ln wi)(ln wi)一个一个相似的结构相似的结构struct sockaddr_in:struct sockaddr_in (“in” ” 代表代表“Internet”)struct so

20、ckaddr_in short int sin_family; /* Internet地址族地址族*/unsigned short int sin_port; /* 端口号端口号*/struct in_addr sin_addr; /* Internet地址地址*/unsigned char sin_zero8; /* 添添0(和(和struct sockaddr一一样大小)样大小)*/; 这个结构提供了方便的手段来访问这个结构提供了方便的手段来访问socket address(struct sockaddr)结构中的每一个元素。)结构中的每一个元素。第二十页,共二百五十二页。中国地质大学中国

21、地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l (3)struct in_addr 专门用来存储专门用来存储 IP地址,其定义如下:地址,其定义如下: /* 因特网地址因特网地址(a structure for historical reasons) */struct in_addr unsigned long s_addr; 如果你声明了一个如果你声明了一个“ ina ” 作为一个作为一个struct sockaddr_in 的结构,的结构, 那么那么“ina.sin_addr.s_addr”就是就是4 个字节的个字节的IP 地址(按网络字节顺序排地

22、址(按网络字节顺序排放)。放)。 需要注意的是,即使需要注意的是,即使(jsh)你的系统仍然使用联合而不是结构来表示你的系统仍然使用联合而不是结构来表示struct in_addr,你仍然可以用上面的方法得到,你仍然可以用上面的方法得到4 个字节的个字节的IP 地址地址.第二十一页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字基础套接字基础(jch)l(4).这些数据结构的一般用法:这些数据结构的一般用法:首先,定义首先,定义(dngy)一个一个Sockaddr_in的结构实例,的结构实例,并将它清零。比如:并将它清零。比如:struct so

23、ckaddr_in myad;memset(&myad,0,sizeof(struct sockaddr_in);然后,为这个结构赋值,比如:然后,为这个结构赋值,比如:myad.sin_family=AF_INET;myad.sin_port=htons(8080); myad.sin_addr.s_addr=htonl(INADDR-ANY);第三步:在函数调用中使用时,将这个结构强制第三步:在函数调用中使用时,将这个结构强制转换为转换为sockaddr类型。如:类型。如:accept(listenfd,(sockaddr*)(&myad),&addrlen);第二十二页,共二百五十二页。

24、中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字使用套接字使用(shyng)的数据类型和相关的问题的数据类型和相关的问题l 2本机字节顺序和网络字节顺序本机字节顺序和网络字节顺序 在具体计算机中的多字节数据的存储顺序,称为本机字节顺序。在具体计算机中的多字节数据的存储顺序,称为本机字节顺序。多字节数据在网络协议报头中的存储顺序,称为网络字节顺序。多字节数据在网络协议报头中的存储顺序,称为网络字节顺序。u在网络上面有着许多在网络上面有着许多(xdu)类型的机器类型的机器,这些机器在表示这些机器在表示数据的字节顺序是不同的数据的字节顺序是不同的, 比如比如i386芯片

25、是低字节在内芯片是低字节在内存地址的低端存地址的低端,高字节在高端高字节在高端,而而alpha芯片却相反芯片却相反. 为了统一起来为了统一起来,在在Linux下面下面,有专门的字节转换函数有专门的字节转换函数. unsigned long int htonl(unsigned long int hostlong) unsigned long int htonl(unsigned long int hostlong) unsigned short int htons(unisgned short int hostshort) unsigned short int htons(unisgned s

26、hort int hostshort) unsigned long int ntohl(unsigned long int netlong) unsigned long int ntohl(unsigned long int netlong) unsigned short int ntohs(unsigned short int netshort) unsigned short int ntohs(unsigned short int netshort) 在这四个转换函数中在这四个转换函数中,h 代表代表host, n 代表代表 network.s 代表代表short l 代表代表long 第

27、一个函数的意义是将本机器上的第一个函数的意义是将本机器上的long数据转化为网络数据转化为网络上的上的long. 其他几个函数的意义也差不多其他几个函数的意义也差不多. 第二十三页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字使用的数据类型和相关套接字使用的数据类型和相关(xinggun)的问的问题题l 3点分十进制的点分十进制的IP地址的转换地址的转换(zhunhun) (1) inet_atonu将将strptr所指的字符串转换成所指的字符串转换成32位的网络字节序二进制位的网络字节序二进制值。值。 include int inet_ato

28、n(const char *strptr,struct in_addr *addrptr);(2) inet_addru功能同上,返回地址。功能同上,返回地址。int_addr_t inet_addr(const char *strptr); (3) inet_ntoau将将32位网络字节序二进制地址转换成点分十进制的串。位网络字节序二进制地址转换成点分十进制的串。 char *inet_ntoa(stuct in_addr inaddr);第二十四页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字使用套接字使用(shyng)的数据类型和相关的问

29、题的数据类型和相关的问题l 4域名服务域名服务 在网络上标志一台机器可以用在网络上标志一台机器可以用IP或者是用域名或者是用域名.那么我们怎么去进行转换呢那么我们怎么去进行转换呢?u struct hostent *gethostbyname(const char *hostname) 可以将机器名可以将机器名(如如 )转换为一个结构指针转换为一个结构指针.在这个结构里面储存了域名的信息在这个结构里面储存了域名的信息 u struct hostent *gethostbyaddr(const char *addr,int len,int type) 可以将一个可以将一个32位的位的IP地址地址

30、(C0A80001)转换为结构指针转换为结构指针. 这两个函数失败时返回这两个函数失败时返回NULL 且设置且设置h_errno错误变量错误变量,调用调用h_strerror()可以得到详细可以得到详细(xingx)的出错信息的出错信息 struct hostent的定义的定义: struct hostent char *h_name; /* 主机的正式名称主机的正式名称 */ char *h_aliases; /* 主机的别名主机的别名 */ int h_addrtype; /* 主机的地址类型主机的地址类型 AF_INET*/ int h_length; /* 主机的地址长度主机的地址长度

31、 对于对于IP4 是是4字节字节32位位*/ char *h_addr_list; /* 主机的主机的IP地址列表地址列表 */ #define h_addr h_addr_list0 /* 主机的第一个主机的第一个IP地址地址*/ 第二十五页,共二百五十二页。面向面向(min xin)连接的传输层套接连接的传输层套接字编程字编程第二十六页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()面向面向(min xin)(min xin)连接的传输层套接字连接的传输层套接字编程编程l套接字的工作过程套接字的工作过程l初等网络函数初等网络函数l完整的读写函数完整

32、的读写函数l面向连接面向连接(linji)(linji)的传输层套接字的传输层套接字举例举例l进程控制进程控制第二十七页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()套接字的工作套接字的工作(gngzu)过程过程第二十八页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l1 socket #include int socket(int domain, int type,int protocol) socket为网络通讯做基本的准备为网络通讯做基本的准备.成功时返回文件成功

33、时返回文件描述符描述符,失败失败(shbi)时返回时返回-1。通过通过errno可知道出错的详细情况可知道出错的详细情况. 第二十九页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l参数参数(cnsh)说明:说明:domain:说明我们网络程序所在的主机采用的通讯说明我们网络程序所在的主机采用的通讯协族协族(AF_UNIX和和AF_INET等等)。uAF_UNIX只能够用于单一的只能够用于单一的Unix系统进程间通信系统进程间通信,而而AF_INET是针对是针对Internet的的,因而可以允许在远程主机因而可以

34、允许在远程主机之间通信之间通信u当我们当我们 man socket时发现时发现 domain可选项是可选项是 PF_*而不而不是是AF_*,因为因为glibc是是posix的实现的实现 所以用所以用PF代替了代替了AF,不过我们都可以使用的不过我们都可以使用的. 第三十页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数type:我们网络程序所采用的通讯协议。我们网络程序所采用的通讯协议。uSOCK_STREAM表明我们用的是表明我们用的是TCP协议协议,这样会提供这样会提供按顺序的按顺序的,可靠可靠,双向双向,面向

35、连接的比特流面向连接的比特流.u SOCK_DGRAM 表明我们用的是表明我们用的是UDP协议协议,这样只会提这样只会提供定长的供定长的,不可靠不可靠,无连接的通信。无连接的通信。 uSOCK_RAW 原始套接字,用来直接访问原始套接字,用来直接访问IP协议。协议。protocol:由于我们指定了由于我们指定了type,所以这个所以这个(zh ge)地方我地方我们一般只要用们一般只要用0来代替就可以了。来代替就可以了。第三十一页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l2 bind int bind(int

36、 sockfd, struct sockaddr *my_addr, int addrlen) bind将本地的端口同将本地的端口同socket返回返回(fnhu)的文件描述的文件描述符捆绑在一起符捆绑在一起.成功是返回成功是返回0,失败的情况和失败的情况和socket一样。一样。第三十二页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l参数说明参数说明sockfd:是由是由socket调用调用(dioyng)返回的文件描述符返回的文件描述符. addrlen:是是sockaddr结构的长度结构的长度. my_a

37、ddr:是一个指向是一个指向sockaddr的指针的指针. 第三十三页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l 构造套接字地址构造套接字地址(dzh)(dzh)举例:举例:int listenfd;struct sockaddr_in server_addr;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&server_addr,sizeof(server_addr); server_addr.sin_family=AF_INET;server_addr.sin

38、_port=htons(80);inet_pton(AF_INET, “211.83.241.244”, & server_addr.sin_addr);bind(listenfd,& server_addr,sizeof(struct sockaddr_in) 第三十四页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l3 listen int listen(int sockfd,int backlog) listen函数将函数将bind的文件描述符变为监听套接字。的文件描述符变为监听套接字。返回返回(fnhu)

39、的情况和的情况和bind一样。一样。第三十五页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l参数说明参数说明sockfd:是是bind后的文件描述符后的文件描述符.。backlog:设置设置(shzh)请求排队的最大长度请求排队的最大长度.当有多个当有多个客户端程序和服务端相连时客户端程序和服务端相连时, 使用这个表示可以使用这个表示可以介绍的排队长度。介绍的排队长度。第三十六页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l4

40、accept int accept(int sockfd, struct sockaddr *addr,int *addrlen)accept成功时返回最后的服务器端的文件描述符,成功时返回最后的服务器端的文件描述符,这个这个(zh ge)时候服务器端可以向该描述符写信息了。时候服务器端可以向该描述符写信息了。失败时返回失败时返回-1 。第三十七页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l参数说明参数说明sockfd:是是listen后的文件描述符后的文件描述符.。addr,addrlen是用来给客户端的程

41、序填写的,服务是用来给客户端的程序填写的,服务器端只要传递指针就可以了器端只要传递指针就可以了.。bind,listen和和accept是服务器端用的函数是服务器端用的函数,accept调调用时,服务器端的程序会一直阻塞到有一个用时,服务器端的程序会一直阻塞到有一个 客户客户程序发出了连接,程序发出了连接, accept成功时返回成功时返回(fnhu)最后的最后的服务器端的文件描述符。服务器端的文件描述符。第三十八页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l5 connect int connect(int

42、 sockfd, struct sockaddr * serv_addr,int addrlen) connect函数是客户端用来同服务端连接的。函数是客户端用来同服务端连接的。成功时返回成功时返回(fnhu)0,sockfd是同服务端通讯的文件是同服务端通讯的文件描述符描述符 。失败时返回失败时返回-1。第三十九页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()初等初等(chdng)网络函数网络函数l参数参数(cnsh)说明说明sockfd:socket返回的文件描述符返回的文件描述符. serv_addr:储存了服务器端的连接信息储存了服务器端的连

43、接信息.其中其中sin_add是服务端的地址是服务端的地址 addrlen:serv_addr的长度的长度 第四十页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()面向面向(min xin)(min xin)连接的传输层套接字连接的传输层套接字l课后作业课后作业编写编写(binxi)简单的扫描器简单的扫描器u端口扫描可以扫描一定范围内的端口;端口扫描可以扫描一定范围内的端口;uIP扫描可以扫描一定范围内的主机。扫描可以扫描一定范围内的主机。u提示:提示:向一个套接字发起连接,成功则可以将其输出。向一个套接字发起连接,成功则可以将其输出。第四十一页,共二

44、百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()完整完整(wnzhng)的读写函数的读写函数l一旦我们建立了连接一旦我们建立了连接,我们的下一步就是进行我们的下一步就是进行通信了通信了.l在在Linux下面把我们前面建立的通道下面把我们前面建立的通道(tngdo) 看看成是文件描述符成是文件描述符,这样服务器端和客户端进行这样服务器端和客户端进行通信时候通信时候,只要往文件描述符里面读写东西了只要往文件描述符里面读写东西了. 就象我们往文件读写一样。就象我们往文件读写一样。第四十二页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫

45、华(曾卫华()完整完整(wnzhng)的读写函数的读写函数l1 写函数write ssize_t write(int fd,const void ssize_t write(int fd,const void * *buf,size_t nbytes)buf,size_t nbytes) write函数将函数将buf中的中的nbytes字节内容写入文件描字节内容写入文件描述符述符fd.成功时返回成功时返回(fnhu)写的字节数写的字节数.失败时返回失败时返回-1. 并设并设置置errno变量变量. 第四十三页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华

46、()完整完整(wnzhng)的读写函数的读写函数在网络程序中在网络程序中,当我们向套接字文件描述符写时有当我们向套接字文件描述符写时有俩种可能俩种可能. 1)write的返回值大于的返回值大于0,表示写了部分或者是全部表示写了部分或者是全部的数据的数据. 2)返回的值小于返回的值小于0,此时出现了错误此时出现了错误.我们要根据错我们要根据错误类型来处理误类型来处理. 如果错误为如果错误为EINTR表示在写的时候出现了中断表示在写的时候出现了中断(zhngdun)错误错误. 如果为如果为EPIPE表示网络连接出现了问题表示网络连接出现了问题(对方已经对方已经关闭了连接关闭了连接). 第四十四页,

47、共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()完整完整(wnzhng)的读写函数的读写函数l为了处理以上的情况为了处理以上的情况,我们自己我们自己(zj)编写一个写函数来处理这几种情况编写一个写函数来处理这几种情况. int my_write(int fd,void int my_write(int fd,void * *buffer,int length) buffer,int length) int bytes_left; int bytes_left; int written_bytes; int written_bytes; char char

48、 * *ptr;ptr; ptr=buffer; ptr=buffer; bytes_left=length; bytes_left=length; while(bytes_left0) while(bytes_left0) / /* * 开始写开始写* */ / written_bytes=write(fd,ptr,bytes_left); written_bytes=write(fd,ptr,bytes_left); if(written_bytes=0) / if(written_bytes0) while(bytes_left0) bytes_read=read(fd,ptr,byte

49、s_read); bytes_read=read(fd,ptr,bytes_read); if(bytes_read0) if(bytes_read0) if(errno=EINTR) if(errno=EINTR) bytes_read=0; bytes_read=0; else else return(-1); return(-1); else else if(bytes_read=0) break; if(bytes_read=0) break; bytes_left-=bytes_read; bytes_left-=bytes_read; ptr+=bytes_read; ptr+=b

50、ytes_read; return(length-bytes_left); return(length-bytes_left); 第四十七页,共二百五十二页。中国地质大学中国地质大学(北京北京)地信学院地信学院 曾卫华(曾卫华()完整完整(wnzhng)的读写函数的读写函数l3 数据的传递 有了上面的两个函数有了上面的两个函数,我们就可以向客户端或者是我们就可以向客户端或者是服务端传递数据了服务端传递数据了.比如比如(br)我们要传递一个结构我们要传递一个结构.可以使用如下方式可以使用如下方式 :/ /* * 客户端向服务端写客户端向服务端写 * */ / struct my_struct m

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 企业培训

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁