第8章 Socket编程课件_第1页
第8章 Socket编程课件_第2页
第8章 Socket编程课件_第3页
第8章 Socket编程课件_第4页
第8章 Socket编程课件_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 Socket编程,第八章 Socket编程,第8章 Socket编程,2,内容,Socket概述 Socket地址 Socket工作步骤 基本Socket系统调用 其他Socket系统调用,第8章 Socket编程,3,一、Socket概述,Socket的定义 Socket的英文原义是“孔”或“插座”。 Socket 是进程间通信的BSD(Berkeley Software Distribution,伯克利软件套件)方法,用来让一个进程和其他的进程相互通信。 定义:一个本地主机建立或拥有的应用进程,在操作系统控制下,与其它(远程)应用进程之间发送和接收数据的接口。,第8章 Socket

2、编程,4,Socket作为一种通信协议应用程序接口(APIs),依赖于操作系统和编程语言,主要有: UNIX:Berkeley Sockets (C语言) WINDOWS:WinSock,第8章 Socket编程,5,常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用IP协议。,第8章 Socket编程,6,

3、Socket编程的相关概念 1、流(Stream) 计算机中的流其实是一种信息的转换。于某一对象,通常把对象接收外界的信息输入称为输入流,把对象向外输出信息为输出流,合称为输入/输出流(I/O Stream)。 对象间进行数据交换时总是先将数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。,第8章 Socket编程,7,2、连接(Connection) 3、阻塞(Block)、非阻塞(Non-block) 4、同步(Synchronous)、异步(asynchronous) 所谓同步,就是在发出一个功能

4、调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。,第8章 Socket编程,8,5、 IP地址 (IP Address) 6、字节顺序(Bytes Order) 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。 7、带外数据(Outband Data) 带外数据,也称为TCP紧急数据,是相连的每一对流套接口间一个逻辑上独立的传输通道。带外数据是独立于普通数据传送给用户的。,第8章 Socket编程,9,需要用到的头文件 数据类型:#include 函数定义:#include ,第8章 Socket编程,10,Berkeley

5、 Socket 常用函数 基本Socket函数 参数获取/设置函数 转换函数,第8章 Socket编程,11,1、基本Socket函数,第8章 Socket编程,12,2、参数获取/设置函数 gethostbyaddr, gethostbyname:返回对应于给定IP地址/主机名的主机信息。 gethostname:获取主机名。 getpeername:获取对方名字。 getsockname:获取一个与套接字相联系的本地名字。,第8章 Socket编程,13,getprotobyname, getprotobynumber:返回对应于给定协议名/协议号的相关协议信息。 getservbynam

6、e, getservbyport:返回对应于给定服务名/端口号的相关服务信息。 getsockopt, setsockopt:获取/设置套接字选项。 ioctl:控制I/O设备。,第8章 Socket编程,14,3、转换函数 (1)IP地址转换 inet_addr():将点间隔的字符串格式地址转换成二进制IP地址。 inet_ntoa():将二进制IP地址转换成点间隔的字符串格式。 (2)字节顺序转换 htons()和htonl() ntohs()和ntohl(),第8章 Socket编程,15,二、Socket地址,通过一个指针参数来指定一个Socket地址结构,该指针结构在。 struct

7、 socketaddr u_short sa_family; /* 地址簇 */ char sa_data14; /* 协议地址 */ ,第8章 Socket编程,16,其中地址簇可以取下列值之一: AF_UNIX AF_INET AF_NS AF_IMPLINK 其中,AF 代表“Address Family”,常见的地址类型是Internet、XNS和UNIX。,第8章 Socket编程,17,对于使用最多的Internet簇,其Socket地址主要包括两大部分:端口号、IP地址,它的地址结构在中定义。 struct sockaddr_in short int sin_family; /*

8、AF_INET */ unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; /*填充0*/ ;,第8章 Socket编程,18,struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; my_addr.sin_port = htons(3490); my_addr.sin_addr.s_addr = inet_addr(132.241.5.10); bzero( 注意:sin_port置为0表示系统随机选择一个未用端口,sin_add

9、r.s_addr置为INADDR_ANY时,系统自动填入本机IP。,第8章 Socket编程,19,三种地址类型的socket结构,Struct sockaddr_in,struct sockaddr_un,Struct sockaddr_ns,第8章 Socket编程,20,三、Socket工作步骤,套接口有三种类型: 流式Socket(面向连接) 数据报式Socket(无连接) 原始Socket(IP),第8章 Socket编程,21,一个服务程序和几个远程客户程序利用面向连接的TCP协议完成通信。 第一步,初始化 服务程序 (1)调用socket创建一个新的套接字,并在传输层实体中分配空

10、间,返回一个socket描述符以便调用中使用该套接字; (2)调用bind将一个端口标识(IP地址和端口号)赋予该套接字,使得远程客户程序能访问该服务程序。,流式套接字工作原理,第8章 Socket编程,22,客户程序 (1)调用socket创建一个新的套接字,并在传输层实体中分配空间,返回一个socket描述符用于在以后的调用中使用该套接字。,第8章 Socket编程,23,第二步,建立连接 服务程序 (1)调用listen分配数据空间,以便存储多个用户的连接建立请求; (2)调用accept将服务程序阻塞起来,等待接收客户程序发来的连接请求。 客户程序 (1)调用connect阻塞客户程序

11、,传输层实体开始建立连接,当连接建立完成时,取消阻塞;,第8章 Socket编程,24,第三步,数据传输 双方使用send和recv完成数据的发送和接收。 第四步,释放连接 每一方使用close关闭套接口,释放连接。,第8章 Socket编程,25,第8章 Socket编程,26,四、基本Socket系统调用,创建一个socket socket编程首先用socket()建立一个socket,指定所要求的通信协议类型,并返回一个整型描述符,该描述符称为socket描述符,其与Linux中的文件描述符类似,也是一个int型的变量。,第8章 Socket编程,27,函数调用: int socket(

12、int family, int type, int protocol); 说明: family参数一般取AF_INET, protocol参数一般取0。 函数返回Socket描述符,返回-1表示出错。,第8章 Socket编程,“协议” 与“family” 及“type”域的可能组合,第8章 Socket编程,29,应用示例: TCP:sockfd = socket(AF_INET,SOCK_STREAM,0); UDP:sockfd =socket(AF_INET, SOCK_DGRAM,0);,第8章 Socket编程,30,Socket配置:bind() 功能:将本地地址与套接口捆绑。

13、函数:int bind (int sockfd, const struct sockaddr *myaddr, socklen_t addrlen) 说明:如果调用成功,则返回值为0,如果调用失败返回值为-1,并设定相应的错误代码errno。最常见的错误是该端口已经被其他程序绑定(EINPROGRESS)。 注意:在Linux系统中,1024以下的端口只有拥有root权限的程序才能绑定。,第8章 Socket编程,31,Bind()系统调用的主要用处: 服务器向系统注册它的众所周知的地址。面向连接和无连接的服务器在接受客户的请求之前都必须做这一步。 客户可为自己注册一个特定的地址,以便服务器可

14、以用这个有效的地址送回响应。,第8章 Socket编程,32,监听:listen() 功能:监听已经绑定的端口。需要在此前调用bind()函数,否则由系统指定一个随机的端口。 函数:int listen(int sockfd, int queue_length); 说明:queue_length用于指定接收队列的长度,也就是在Server程序调用accept函数之前最大允许进入的连接请求数,多余的连接请求将被拒绝,典型取值为5。,第8章 Socket编程,33,操作系统,Web 服务器,服务器初始化,第8章 Socket编程,34,连接:connect() 功能:建立与服务器的连接。 函数:i

15、nt connect (int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); 说明:servaddr是一个sockaddr结构,用于指定所要连接的服务器的地址(Server的IP地址和端口号)。 addrlen指明sockaddr结构的大小。,第8章 Socket编程,35,OS,1. socket(),Web 服务器,2. bind(80),3. listen(),80,Listen queue,客户,connect(),Request from (IP, port),建立与服务器的连接,第8章 Socket编程,3

16、6,操作系统,Web 服务器,80,Listen 队列,客户1,客户3,客户2,客户请求在listen队列中获取先进先出服务(排队),服务器忙,第8章 Socket编程,37,接受连接:accept() 功能:响应客户的连接请求,建立与客户端的连接。产生一个新的socket描述符来描述该连接,这个连接用来与发起该连接请求的客户交换数据。 函数:int accept(int sockfd,struct sockaddr *addr,int addrlen); 说明:addr将在函数调用后填入对方(客户端)的地址信息,如对方的IP、端口等。,第8章 Socket编程,38,操作系统,Web 服务器

17、,80,Listen 队列,客户 1,客户3,客户2,客户请求在listen队列中获取先进先出服务,accept(),已连接的 socket,accept() 调用,第8章 Socket编程,39,服务器都可工作在两种不同的方式: 循环方式(iterative mode)在计算机中一次只运行一个服务器进程。当有多个客户进程请求服务时,服务器进程就按请求的先后顺序依次做出响应。 并发方式(concurrent)在计算机中同时运行多个服务器进程,每一个服务器进程对某个特定的客户进程做出响应。,服务器的两种工作方式,第8章 Socket编程,40,发送和接收 在完成了上述的初始化工作后,就可以开始传

18、输数据了。 面向连接的发送和接收 : send() 和 recv() 无连接的发送和接收:sendto()和recvfrom(),第8章 Socket编程,41,1、send() 功能:用于TCP协议中发送。 函数:int send(int sockfd, char *buf, int len, int flags); 说明:函数返回已发送的字节数,返回-1表示出错。 send缺省是阻塞函数,直到发送完毕或出错。 注意:如果函数返回值与参数len不相等,则剩余的未发送信息需要再次发送。,第8章 Socket编程,42,flags参数,Flags一般情况下设置为0。但可以选择下列设置: MSG_

19、DONTROUTE:表示不使用指定路由,对send、sendto有效 MSG_PEEK:对recv, recvfrom有效,表示读出网络数据后不清除已读的数据 MSG_OOB:对发送接收都有效,表示发送或接受加急数据,第8章 Socket编程,43,2、recv() 功能:用于TCP协议中接收。 函数:int recv(int sockfd, char *buf, int len, int flags); 说明:函数返回实际接收到的字节数,返回-1表示出错。 recv缺省是阻塞函数,直到接收到信息或出错才返回。,第8章 Socket编程,44,3、sendto() 功能:用于UDP协议中发送。

20、 函数:int sendto(int sockfd, char *buf, int nbytes, int flags, struct sockaddr *to, int addrlen); 说明:函数返回已发送的字节数,返回-1表示出错。 sendto缺省是阻塞函数,直到发送完毕或出错。 注意:如果函数返回值与参数nbytes不相等,则剩余的未发送信息需要再次发送。,第8章 Socket编程,45,4、recvfrom() 功能:用于UDP协议中接收。 函数:int recvfrom(int sockfd,char *buf,int nbytes,int flags,struct socka

21、ddr *from, int *addrlen); 说明:函数返回实际接收的字节数,返回-1表示出错。 recvfrom是阻塞函数,直到接收到信息或出错。,第8章 Socket编程,46,关闭Socket 1、close() 功能:关闭特定的socket连接。 函数:int close(int sockfd);,第8章 Socket编程,47,2、shutdown() 功能:可以单方面的中断连接,即禁止某个方向的信息传递。 函数:int shutdown(int sockfd, int how); 说明: 参数how: 0 - 禁止接收信息。 1 - 禁止发送信息。 2 - 接收和发送都被禁止

22、,与close()函数效果相同。,第8章 Socket编程,48,五、其他Socket系统调用,getpeername() 功能:返回和给定套接字相连的对方对等层进程名。 函数:int getpeername(int sockfd, struct sockaddr *peer, int *addrlen); 说明:参数peer是一个指向struct sockaddr或者struct sockaddr_in的指针。,第8章 Socket编程,49,getsockname() 功能:返回和一个套接字相联系的本地名字。 函数:int getsockname(int sockfd, struct so

23、ckaddr *addr, int *addrlen); 说明:addr用来存放返回的本地地址;addrlen存放的是返回的地址长度。,第8章 Socket编程,50,gethostname() 功能:获取主机名。 函数:int gethostname(char *hostname, size_t size); 说明:hostname是一个存放主机名字的字符数组;返回的hostname可以作为gethostbyname()的参数。,第8章 Socket编程,51,gethostbyname() 功能:获取本地IP地址。 函数:struct hostent *gethostbyname(cons

24、t char *name); 说明:gethostbyname()返回一个指向hostent结构的指针,或者是一个NULL指针表示错误。,第8章 Socket编程,52,字节排序 在字节顺序不一致时可以用下列的4种函数来进行转换。 #include #include u_long htonl(u_long hostlong); u_short htons(u_long hostlong); u_long ntohl(u_long hostlong); u_chort ntohs(u_long hostlong);,第8章 Socket编程,53,字节操作 处理各种套接字地址结构中有协议多字节的

25、字段。 Bcopy(char *src,char *dest,int nbytes); 字符串拷贝 Bzero(char *dest,int nbytes); 把指定数量的空字节写入指定的目的地址。 int bcmp(char *ptr1,char *ptr2,int nbytes); 对任意两个字符串进行比较。,第8章 Socket编程,54,IP地址格式转换 下列两个函数用于在Internet的用小数点分隔的十进制IP地址与二进制IP地址之间进行转换。 #include #include #include unsigned long inet_addr (const char *cp); char* inet_ntoa (

温馨提示

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

评论

0/150

提交评论