第四讲_套接字API_第1页
第四讲_套接字API_第2页
第四讲_套接字API_第3页
第四讲_套接字API_第4页
第四讲_套接字API_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

1、lTCP/IP协议存在于协议存在于OS中,网络服务通过中,网络服务通过OS提供提供l在在OS中增加支持中增加支持TCP/IP的的系统调用系统调用Berkeley套接字套接字l如如Socket,Connect,Send,Recv等等l1981提出于提出于BSD4.1 UNIX,本书基于本书基于BSD4.4 版本版本1. 套接字是一个主机本地应用程序所创建的套接字是一个主机本地应用程序所创建的, 为操作系为操作系统所控制的接口统所控制的接口 (“门门”) .2. 应用进程通过这个接口应用进程通过这个接口,使用传输层提供的服务使用传输层提供的服务, 跨网跨网络发送络发送(/接收接收)消息到消息到(/

2、从从)其他应用进程。其他应用进程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由应用程序由应用程序开发者控制开发者控制由操作系统控制由操作系统控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercontrolled byoperatingsystemhost orserverinternetl来自来自UNIX系统系统lBerkeley套接字套接字v AR

3、PA要求伯克利分校将要求伯克利分校将TCP/IP移植到移植到UNIX中中v 需要创建一个接口,便于应用程序使用这个接口需要创建一个接口,便于应用程序使用这个接口 进行网络通信进行网络通信v 尽可能使用现有的系统调用尽可能使用现有的系统调用,同时添加新的系统同时添加新的系统调用支持调用支持TCP/IP。v这个系统被称为这个系统被称为BSD UNIX 套接字,成为事实套接字,成为事实上的标准上的标准指明一个协议接口指明一个协议接口l考虑:接口是专门针对考虑:接口是专门针对TCP/IP, 还是可以还是可以为其它协议所用呢为其它协议所用呢?方法一方法一: :定义专门支持定义专门支持TCP/IPTCP/

4、IP通信的一些函数通信的一些函数方法二方法二: :定义支持一般网络通信的函数,用参数是定义支持一般网络通信的函数,用参数是TCP/IPTCP/IP通信作为一种特例通信作为一种特例BerkeleyBerkeley套接字使用第二种办法,具有通用性,套接字使用第二种办法,具有通用性,TCP/IPTCP/IP是一个族是一个族PF_INETPF_INET使用服务的类型,而不是指定协议名使用服务的类型,而不是指定协议名l争论:争论: 通用性没有必要,使应用程序难以阅读通用性没有必要,使应用程序难以阅读 通用性可以使程序员免于了解协议族的细节通用性可以使程序员免于了解协议族的细节l OS将文件描述符实现为一

5、个指针数组,指向一个内部将文件描述符实现为一个指针数组,指向一个内部的数据结构:进程描述符表的下标的数据结构:进程描述符表的下标l 套接字和文件类似,每个活动套接字使用一个小整数标套接字和文件类似,每个活动套接字使用一个小整数标识,进程的文件描述符和套接字描述符值不能相同识,进程的文件描述符和套接字描述符值不能相同l socket函数:创建套接字描述符(不是函数:创建套接字描述符(不是open函数)函数)0:1:2:3: 进程的文件描述符表进程的文件描述符表(一个进程一张)(一个进程一张)用于文件用于文件0的内部数据结构的内部数据结构用于文件用于文件1的内部数据结构的内部数据结构用于文件用于文

6、件2的内部数据结构的内部数据结构用于文件用于文件3的内部数据结构的内部数据结构l调用调用socket将创建一个新的描述符条目将创建一个新的描述符条目l结构的许多字段是其他的系统调用来填结构的许多字段是其他的系统调用来填0:1:2:3:4: 描述符表描述符表(一个进程一张)(一个进程一张)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:l创建方式相同,使用方式不同创建方式相同,使用方式不同l等待传入连接的套接字等待传入连接的套接字被动被动,如服务器如服务器套接字套接字l发起连接的套接字发起连

7、接的套接字主动主动,如客户套接字如客户套接字l指明端点地址:创建时不指定,使用时指指明端点地址:创建时不指定,使用时指明明TCP/IP需要指明协议端口号和需要指明协议端口号和IP地址地址TCP/IP协议族:协议族:PF_INETTCP/IP的地址族:的地址族:AF_INETl 套接字系统定义的一般化的地址结构套接字系统定义的一般化的地址结构 (地址族,该族的端点地址)(地址族,该族的端点地址)套接字的普通套接字的普通C定义结定义结构构struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;/14B通用的地址结构(只是很通用的

8、地址结构(只是很适用于适用于AF_INET族中的地族中的地址)址)TCP/IP的地址定义的地址定义struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_port;/2Bstruct in_addr sin_addr;/4Bchar sin_zero8;/8B IP专用的结构专用的结构l套接字调用分为两组:套接字调用分为两组:Z主调用:提供下层功能的访问主调用:提供下层功能的访问Z实用例程:提供帮助实用例程:提供帮助l套接字带有参数,允许以多种方式来使用套接字带有参数,允许以多种方式来使用它们。它们。可被客户或服务器使用

9、可被客户或服务器使用可被可被TCP或或UDP使用使用可使用特定或非特定的远程端点地址可使用特定或非特定的远程端点地址l int Socket( int domain, int type, int protocol)l功能:功能:创建一个新的套接字,返回套接字描述符创建一个新的套接字,返回套接字描述符l参数说明:参数说明:udomain:域类型,指明使用的协议栈,如:域类型,指明使用的协议栈,如TCP/IP使使用的是用的是 PF_INETutype: 指明需要的服务类型指明需要的服务类型, 如如l 功能:为套接字指明一个本地端点地址功能:为套接字指明一个本地端点地址vTCP/IP协议使用协议使用

10、sockaddr_in结构,包含结构,包含IP地址和地址和端口号端口号v服务器使用它来指明熟知的端口号,然后等待连接服务器使用它来指明熟知的端口号,然后等待连接l 参数说明:参数说明:Sockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字my_addr:本地地址,本地地址,IP地址和端口号地址和端口号addrlen :地址长度地址长度l 举例:举例:bind(sockfd, (struct sockaddr *)&address, sizeof(address); l功能:功能:面向连接的套接字使用它将一个套接字置为被动模面向连接的套接字使用它将一个套接字置为被动模

11、式,并准备接收传入连接。用于服务器,指明某个式,并准备接收传入连接。用于服务器,指明某个套接字连接是被动的套接字连接是被动的l参数说明:参数说明:ZSockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字Z input_queue_size:该套接字使用的队列长度该套接字使用的队列长度,指定在请求队列中允许的最大请求数指定在请求队列中允许的最大请求数 l举例:举例:listen(sockfd,20)l 功能:获取传入连接请求,返回新的连接的套接字功能:获取传入连接请求,返回新的连接的套接字描述符。描述符。为每个新的连接请求创建了一个新的套接字,服务器只对为每个新的连接

12、请求创建了一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套接字接受其他的连新的连接使用该套接字,原来的监听套接字接受其他的连接请求。接请求。新的连接上传输数据使用新的套接字,使用完毕,服务器新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。将关闭这个套接字。l 参数说明:参数说明:Sockfd:套接字描述符,指明正在监听的套接字套接字描述符,指明正在监听的套接字addr:提出连接请求的主机地址提出连接请求的主机地址addrlen:地址长度地址长度l 举例:举例:new_sockfd = accept(sockfd, (struct sockaddr *)&addr

13、ess, sizeof(address); l功能:功能: 同远程服务器建立主动连接,成功时同远程服务器建立主动连接,成功时返回返回0,若连接失败返回,若连接失败返回1。l参数说明:参数说明:Sockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字Server_addr:指明远程端点:指明远程端点:IP地址和端口号地址和端口号sockaddr_len :地址长度地址长度l举例举例(P49): connect(s,remaddr,remaddrlen)l 功能:功能:在在TCPTCP连接上发送数据连接上发送数据, ,返回成功传送数据的长度,返回成功传送数据的长度,出错时

14、返回出错时返回1 1。sendsend会将外发数据复制到会将外发数据复制到OSOS内核中,也可以使用内核中,也可以使用sendsend发送面向连接的发送面向连接的UDPUDP报文。报文。l 参数说明:参数说明:usockfdsockfd: :套接字描述符套接字描述符udata:data:指向要发送数据的指针指向要发送数据的指针udata_lendata_len: :数据长度数据长度uflags:flags:通常为通常为0 0(其他情况:如(其他情况:如MSG_OOBMSG_OOB处理带外数处理带外数据,据,MSG_DONTROUTEMSG_DONTROUTE不使用路由)不使用路由)l举例举例(

15、p50)(p50):send(s,req,strlen(req),0);send(s,req,strlen(req),0);l 功能:基于功能:基于UDPUDP发送数据报,返回实际发送的数据长度,出错发送数据报,返回实际发送的数据长度,出错时返回时返回1 1l 参数说明:参数说明:sockfdsockfd: :套接字描述符套接字描述符 data:data:指向要发送数据的指针指向要发送数据的指针 data_lendata_len: :数据长度数据长度 flags:flags:通常为通常为0 0 remaddrremaddr: :远端地址:远端地址:IPIP地址和端口号地址和端口号 remadd

16、r_lenremaddr_len : :地址长度地址长度l举例:举例:sendto(sockfd,buf,sizeof(buf),0,(struct sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr sockaddr * *)&address, sizeof(address)&address, sizeof(address);); l 功能:功能: 从从TCP接收数据接收数据,返回实际接收的数据长度,出错时返回返回实际接收的数据长度,出错时返回1。 服务器使用其接收客户请求,客户使用它接受服务器的应答。服务器使用其接收客户请求,客户使用它接受服务

17、器的应答。如果没有数如果没有数据,将阻塞据,将阻塞。如果如果TCP收到的数据收到的数据大于大于(/小于小于)缓存的大小,缓存的大小,只抽出能够填满缓存的足只抽出能够填满缓存的足够数据够数据(/抽出所有数据并返回它实际接收的字节数抽出所有数据并返回它实际接收的字节数)。 也也可以使用可以使用recv接收面向连接的接收面向连接的UDP的报文,若缓存不能装下整个报文,的报文,若缓存不能装下整个报文,填满缓存后剩下的数据将被丢弃。填满缓存后剩下的数据将被丢弃。l 参数说明:参数说明:uSockfd:套接字描述符套接字描述符uBuf:指向内存块的指针指向内存块的指针uBuf_len:内存块大小,以字节为

18、单位内存块大小,以字节为单位uflags:一般为一般为0(MSG_WAITALL接收到指定长度数据时才返回)接收到指定长度数据时才返回)l 举例:举例:recv(sockfd,buf,8192,0)l 功能:从功能:从UDP接收数据,返回实际接收的字节数,失败时接收数据,返回实际接收的字节数,失败时返回返回1l 参数说明:参数说明:uSockfd:套接字描述符套接字描述符ubuf:指向内存块的指针指向内存块的指针ubuf_len:内存块大小,以字节为单位内存块大小,以字节为单位uflags:一般为一般为0ufrom:远端的地址,远端的地址,IP地址和端口号地址和端口号ufromlen:远端地址

19、长度远端地址长度l 举例:举例:recvfrom(sockfd,buf,8192,0, ,(struct sockaddr *)&address, sizeof(address); l功能:功能:撤销套接字撤销套接字.如果如果只有只有一个进程使用,立即终止连接并撤销该一个进程使用,立即终止连接并撤销该套接字,如果多个进程共享该套接字,将引用数套接字,如果多个进程共享该套接字,将引用数减一,如果引用数降到零,则撤销它减一,如果引用数降到零,则撤销它。l参数说明:参数说明:|Sockfd:套接字描述符套接字描述符l举例:举例:close(socket_descriptor)l read和和writ

20、e在在UNIX和和Linux中,可以代替中,可以代替recv和和send,因为都调因为都调用内核的用内核的sosend实现。实现。l 小结:小结:socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvfrom*sendto*recvmsgsendmsgshutdowngetpeernamegetsockoptsetsockoptl 网络字节顺序:最高位字节在前网络字节顺序:最高位字节在前l 有些套接字例程要求参数按照网络字节顺序存储。有些套接字例程要求参数按照网络字节顺序存储。如如sockaddr_inl 需要网络字节顺序和本地主机字节顺序进行转换需要网络字节顺序和本地主机字节顺序进行转换的函数,坚持使用,便于移植。的函数,坚持使用,便于移植。Address AAddress A+1l分为短(分为短(short 16位位)和长(和长(long 32位位)两两种种htons:将一个短整数从本地字节顺序转换为将一个短整数从本地字节顺序转换为网络字节顺序;网络字节顺序;ntohs:将一个短整数从网络字节顺序转换为将一个短整数从网络字节顺序转

温馨提示

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

评论

0/150

提交评论