第四讲 套接字API.ppt2012_第1页
第四讲 套接字API.ppt2012_第2页
第四讲 套接字API.ppt2012_第3页
第四讲 套接字API.ppt2012_第4页
第四讲 套接字API.ppt2012_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、1. 套接字套接字API介绍介绍2. 套接字套接字API中的主要系统调用中的主要系统调用3. 在程序中使用套接字调用在程序中使用套接字调用1. TCP/IP协议存在于协议存在于OS中,网络服务通过中,网络服务通过OS提供提供2. 在在OS中增加支持中增加支持TCP/IP的的系统调用系统调用Berkeley套接字套接字3. 如如Socket,Connect,Send,Recv等等4. 1981提出于提出于BSD4.1 UNIX,本书基于本书基于BSD4.4 版本版本1. 套接字是一个主机本地应用程序所创建的套接字是一个主机本地应用程序所创建的, 为操作系为操作系统所控制的接口统所控制的接口 (“

2、门门”) .2. 应用进程通过这个接口应用进程通过这个接口,使用传输层提供的服务使用传输层提供的服务, 跨网跨网络发送络发送(/接收接收)消息到消息到(/从从)其他应用进程。其他应用进程。3.Client/server模式的通信接口模式的通信接口套接字接口套接字接口.socketprocessTCP withbuffers,variablessocket由应用程序由应用程序开发者控制开发者控制由操作系统控制由操作系统控制host orserverprocessTCP withbuffers,variablessocketcontrolled byapplicationdevelopercont

3、rolled byoperatingsystemhost orserverinternet1. 来自UNIX系统2. Berkeley套接字 ARPA要求伯克利分校将要求伯克利分校将TCP/IP移植到移植到UNIX中中 需要创建一个接口,便于应用程序使用这个接需要创建一个接口,便于应用程序使用这个接口进行网络通信口进行网络通信 尽可能使用现有的系统调用,称为尽可能使用现有的系统调用,称为BSD UNIX 套接字套接字 成为事实上的标准成为事实上的标准指明一个协议接口1. 考虑:接口是专门针对TCP/IP, 还是可以为其它协议所用呢?2. 争论: 通用性没有必要,使应用程序难以阅读通用性没有必要

4、,使应用程序难以阅读 通用性可以使程序员免于了解协议族的细节通用性可以使程序员免于了解协议族的细节1.OS将文件描述符实现为一个指针数组,指向一个内部的数据结构:进程描述符表的下标2.套接字和文件类似,每个活动套接字使用一个小整数标识,进程的文件描述符和套接字描述符值不能相同3.socket函数:创建套接字描述符(不是open函数)0:1:2:3: 描述符表描述符表(一个进程一张)(一个进程一张)用于文件用于文件0的内部数据结构的内部数据结构用于文件用于文件1的内部数据结构的内部数据结构用于文件用于文件2的内部数据结构的内部数据结构用于文件用于文件3的内部数据结构的内部数据结构1. 调用soc

5、ket将创建一个新的描述符条目和新的数据结构2. 结构的许多字段是其他的系统调用来填0:1:2:3:4: 描述符表描述符表(一个进程一张)(一个进程一张)family: PF_INETservice: SOCK_STREAMLocal IP:Remote IP:Local port:Remote port:套接字的数据结构套接字的数据结构1. 创建方式相同,使用方式不同2. 等待传入连接的套接字被动,如服务器套接字3. 发起连接的套接字主动,如客户套接字4. 指明端点地址:创建时不指定,使用时指明 TCP/IP需要指明协议端口号和需要指明协议端口号和IP地址地址 TCP/IP协议族:协议族:P

6、F_INET TCP/IP的地址族:的地址族:AF_INET注意:具有相同的数字值,防止误用注意:具有相同的数字值,防止误用套接字系统定义的一般化的地址结构(地址族,该族的端点地址)(地址族,该族的端点地址)套接字的普通套接字的普通C定义结定义结构构struct sockaddr u_char sa_len;u_short sa_family;char sa_data14;只是很适用于只是很适用于AF_INET族族中的地址中的地址TCP/IP的地址定义的地址定义struct sockaddr_in u_char sin_len;u_short sin_family;u_short sin_po

7、rt;struct in_addr in_addr;char sin_zero8;in_addr结构的结构的定义定义struct in_addr u_long s_addr;1. 套接字调用分为两组: 主调用:提供下层功能的访问主调用:提供下层功能的访问 实用例程:提供帮助实用例程:提供帮助2. 套接字带有参数,允许以多种方式来使用它们。1. int Socket( int domain, int type, int protocol)2. 功能:创建一个新的套接字,返回套接字描述符3. 参数说明: domain:域类型,指明使用的协议栈,如:域类型,指明使用的协议栈,如TCP/IP使用的使用

8、的是是 PF_INET type: 指明需要的服务类型指明需要的服务类型, 如如1.int Connect(int sockfd,struct sockaddr_in *server_addr, int sockaddr_len)2. 功能: 同远程服务器建立主动连接,成功时返回0,若连接失败返回1。客户端的调用3. 参数说明: Sockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字 Server_addr:指明远程端点:指明远程端点:IP地址和端口号地址和端口号 sockaddr_len :地址长度地址长度举例(P49): connect(s,remaddr,re

9、maddrlen)#include #include #include #include #include #include #define DEST_IP 2 #define DEST_IP 2 #define DEST_PORT 23 #define DEST_PORT 23 main() int sockfd; main() int sockfd; / /* *将用来存储远程信息将用来存储远程信息* */ / struct sockaddr_in dest_addr; struct sockaddr_in dest_addr; sockfd

10、 = socket(PF_INET, SOCK_STREAM, 0); sockfd = socket(PF_INET, SOCK_STREAM, 0); / /* *主机字节序主机字节序* */ / dest_addr.sin_family = AF_INET; dest_addr.sin_family = AF_INET; / /* *网络字节序,短整形网络字节序,短整形* */ / dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_port = htons(DEST_PORT); dest_addr.sin_addr.s_addr

11、= inet_addr(DEST_IP); dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); / /* *将剩下的结构中的空间置将剩下的结构中的空间置0 0* */ / bzero(&(dest_addr.sin_zero), 8); bzero(&(dest_addr.sin_zero), 8); / /* *不要忘记在代码中对不要忘记在代码中对connect()connect()进行错误检查进行错误检查* */ / int connect(sockfd, (struct sockaddr int connect(sockfd,

12、(struct sockaddr* *)&dest_addr, sizeof(struct sockaddr); )&dest_addr, sizeof(struct sockaddr); 1. int Send(int sockfd, const void * data, int data_len, unsigned int flags)2.2. 功能:功能: 在在TCPTCP连接上发送数据连接上发送数据, ,返回成功传送数据的长度,出返回成功传送数据的长度,出错时返回错时返回1 1。 sendsend会将外发数据复制到会将外发数据复制到OSOS内核中,也可以使用内核中,也可

13、以使用sendsend发送面向连接的发送面向连接的UDPUDP报文。报文。3.3. 参数说明:参数说明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要发送数据的指针指向要发送数据的指针 data_len:data_len:数据长度数据长度 flags:flags:一般为一般为0 0举例举例(p50)(p50):send(s,req,strlen(req),0);send(s,req,strlen(req),0);1.int Sendto(int sockfd, const void * data, int data_len, unsigned int fla

14、gs, struct sockaddr *remaddr,int remaddr_len)2.2. 功能:基于功能:基于UDPUDP发送数据报,返回实际发送的数据长度,出发送数据报,返回实际发送的数据长度,出错时返回错时返回1 13.3. 参数说明:参数说明: sockfd:sockfd:套接字描述符套接字描述符 data:data:指向要发送数据的指针指向要发送数据的指针 data_len:data_len:数据长度数据长度 flags:flags:一般为一般为0 0 remaddr:remaddr:远端地址:远端地址:IPIP地址和端口号地址和端口号 remaddr_len :remadd

15、r_len :地址长度地址长度举例:举例:sendto(sockfd,buf,sizeof(buf),0,(struct sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr sockaddr * *)&address, sizeof(address); )&address, sizeof(address); 1.int recv(int sockfd, void *buf, int buf_len,unsigned int flags); 2.功能:功能: 从从TCP接收数据接收数据,返回实际接收的数据长度,出错时返回返回实际接收的

16、数据长度,出错时返回1。 服务器使用其接收客户请求,客户使用它接受服务器的应答。服务器使用其接收客户请求,客户使用它接受服务器的应答。如果没有数据,将阻塞,如果收到的数据大于缓存的大小,多余的如果没有数据,将阻塞,如果收到的数据大于缓存的大小,多余的数据将丢弃。数据将丢弃。也也可以使用可以使用recv接收面向连接的接收面向连接的UDP的报文的报文3.参数说明:参数说明: Sockfd:套接字描述符套接字描述符 Buf:指向内存块的指针指向内存块的指针 Buf_len:内存块大小,以字节为单位内存块大小,以字节为单位 flags:一般为一般为0 举例:举例:recv(sockfd,buf,819

17、2,0)1.int recvfrom(int sockfd, void *buf, int buf_len,unsigned int flags,struct sockaddr *from,int fromlen2. 功能:从功能:从UDP接收数据,返回实际接收的字节数,接收数据,返回实际接收的字节数,失败时返回失败时返回13. 参数说明:参数说明:Sockfd:套接字描述符套接字描述符buf:指向内存块的指针指向内存块的指针buf_len:内存块大小,以字节为单位内存块大小,以字节为单位flags:一般为一般为0from:远端的地址,远端的地址,IP地址和端口号地址和端口号fromlen:远

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

19、nd(int sockfd,struct sockaddr * my_addr,int addrlen)2. 功能:为套接字指明一个本地端点地址功能:为套接字指明一个本地端点地址 TCP/IP协议使用协议使用sockaddr_in结构,包含结构,包含IP地址和端地址和端口号口号 服务器使用它来指明熟知的端口号,然后等待连接服务器使用它来指明熟知的端口号,然后等待连接3. 参数说明:参数说明: Sockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字 my_addr:本地地址,本地地址,IP地址和端口号地址和端口号 addrlen :地址长度地址长度举例:举例:bind

20、(sockfd, (struct sockaddr *)&address, sizeof(address); 1.int listen(int sockfd,int input_queue_size)2. 功能:功能: 面向连接的套接字使用它将一个套接字置为面向连接的套接字使用它将一个套接字置为被动模式被动模式,并准备接收传入连接。并准备接收传入连接。 用于服务器,指明某个套接字连接是被动的用于服务器,指明某个套接字连接是被动的3. 参数说明:参数说明: Sockfd:套接字描述符,指明创建连接的套接字套接字描述符,指明创建连接的套接字 input_queue_size:该套接字使用的

21、队列长度该套接字使用的队列长度,指定在指定在请求队列中允许的最大请求数请求队列中允许的最大请求数 举例:举例:listen(sockfd,20)1.int accept(int sockfd, void *addr, int *addrlen);2. 功能:获取传入连接请求,返回新的连接的套接字功能:获取传入连接请求,返回新的连接的套接字描述符。描述符。 为每个新的连接请求创建了一个新的套接字,服务器只对新的连接为每个新的连接请求创建了一个新的套接字,服务器只对新的连接使用该套接字,原来的监听套接字接受其他的连接请求。使用该套接字,原来的监听套接字接受其他的连接请求。 新的连接上传输数据使用新

22、的套接字,使用完毕,服务器将关闭这新的连接上传输数据使用新的套接字,使用完毕,服务器将关闭这个套接字。个套接字。3. 参数说明:参数说明: Sockfd:套接字描述符,指明正在监听的套接字套接字描述符,指明正在监听的套接字 addr:提出连接请求的主机地址提出连接请求的主机地址 addrlen:地址长度地址长度举例:举例:new_sockfd = accept(sockfd, (struct sockaddr *)&address, sizeof(address); 1. read和和write 在在UNIX和和Linux中,可以用中,可以用read和和write代替代替recv和和s

23、end,因为都调用内核的因为都调用内核的sosend实现。实现。2. 小结:小结:socket*connect*send(write)*recv(read)*close*bind *listen *accept *recvmsgsendmsgrecvfromsendto *shutdowngetpeernamegetsockoptsetsockopt1. 网络字节顺序:最高位字节在前2. 有些套接字例程要求参数按照网络字节顺序存储。如sockaddr_in3. 需要网络字节顺序和本地主机字节顺序进行转换的函数,坚持使用,便于移植。4. 分为短(short 16位)和长(long 32位)两种 ht

温馨提示

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

评论

0/150

提交评论