《Socket编程》PPT课件.ppt

上传人:wuy****n92 文档编号:69913108 上传时间:2023-01-11 格式:PPT 页数:58 大小:334KB
返回 下载 相关 举报
《Socket编程》PPT课件.ppt_第1页
第1页 / 共58页
《Socket编程》PPT课件.ppt_第2页
第2页 / 共58页
点击查看更多>>
资源描述

《《Socket编程》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Socket编程》PPT课件.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、网络编程网络编程第八章第八章第八章第八章 SocketSocket编程编程编程编程1网络编程网络编程常州大学信息学院常州大学信息学院内容内容1Socket概述概述 2Socket地址地址3Socket工作步骤工作步骤4基本基本Socket系统调用系统调用5其他其他Socket系统调用系统调用2网络编程网络编程常州大学信息学院常州大学信息学院一、一、Socket概述概述 Socket的定义的定义 Socket的英文原义是“孔”或“插座”。Socket 是进程间通信的BSD(Berkeley Software Distribution,伯克利软件套件)方法,用来让一个进程和其他的进程相互通信。定义

2、:一个本地主机建立或拥有的应用进程,在操作系统控制下,与其它(远程)应用进程之间发送和接收数据的接口。3网络编程网络编程常州大学信息学院常州大学信息学院 Socket作为一种通信协议应用程序接口(APIs),依赖于操作系统和编程语言,主要有:UNIX:Berkeley Sockets (C语言)WINDOWS:WinSock4网络编程网络编程常州大学信息学院常州大学信息学院 常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的S

3、ocket,对应于无连接的UDP服务应用。Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用IP协议。5网络编程网络编程常州大学信息学院常州大学信息学院Berkeley Socket 常用函数常用函数基本Socket函数参数获取/设置函数转换函数10网络编程网络编程常州大学信息学院常州大学信息学院1、基本Socket函数11网络编程网络编程常州大学信息学院常州大学信息学院2、参数获取/设置函数gethostbyaddr,gethostbyname:返回对应于给定IP地址/主机名的主机信息。gethostname:获取主机名。getpeername:获取对方名字。gets

4、ockname:获取一个与套接字相联系的本地名字。12网络编程网络编程常州大学信息学院常州大学信息学院getprotobyname,getprotobynumber:返回对应于给定协议名/协议号的相关协议信息。getservbyname,getservbyport:返回对应于给定服务名/端口号的相关服务信息。getsockopt,setsockopt:获取/设置套接字选项。ioctl:控制I/O设备。13网络编程网络编程常州大学信息学院常州大学信息学院3、转换函数(1)IP地址转换inet_addr():将点间隔的字符串格式地址转换成二进制IP地址。inet_ntoa():将二进制IP地址转换

5、成点间隔的字符串格式。(2)字节顺序转换htons()和htonl()ntohs()和ntohl()14网络编程网络编程常州大学信息学院常州大学信息学院二、二、Socket地址地址 通过一个指针参数来指定一个Socket地址结构,该指针结构在。struct socketaddr u_short sa_family;/*地址簇*/char sa_data14;/*协议地址*/15网络编程网络编程常州大学信息学院常州大学信息学院其中地址簇可以取下列值之一:AF_UNIXAF_INETAF_NSAF_IMPLINK 其中,AF 代表“Address Family”,常见的地址类型是Internet、

6、XNS和UNIX。16网络编程网络编程常州大学信息学院常州大学信息学院 对于使用最多的Internet簇,其Socket地址主要包括两大部分:端口号、IP地址,它的地址结构在中定义。struct sockaddr_in short int sin_family;/*AF_INET*/unsigned short int sin_port;struct in_addr sin_addr;unsigned char sin_zero8;/*填充0*/;17网络编程网络编程常州大学信息学院常州大学信息学院 struct sockaddr_in my_addr;my_addr.sin_family=A

7、F_INET;my_addr.sin_port=htons(3490);=inet_addr(132.241.5.10);bzero(&(my_addr.sin_zero),8);注意:sin_port置为0表示系统随机选择一个未用端口,sin_addr.s_addr置为INADDR_ANY时,系统自动填入本机IP。18网络编程网络编程常州大学信息学院常州大学信息学院三种地址类型的socket结构 Struct sockaddr_instruct sockaddr_un Family2-byte port4-byte IP(unused)Family4-byte net ID6-byte ho

8、st ID2-byte port(unused)FamilyPathname(最大108字节)Struct sockaddr_ns19网络编程网络编程常州大学信息学院常州大学信息学院三、三、Socket工作步骤工作步骤 套接口有三种类型:流式Socket(面向连接)数据报式Socket(无连接)原始Socket(IP)20网络编程网络编程常州大学信息学院常州大学信息学院 一个服务程序和几个远程客户程序利用面向连接的TCP协议完成通信。第一步,初始化初始化 服务程序 (1)调用socket创建一个新的套接字,并在传输层实体中分配空间,返回一个socket描述符以便调用中使用该套接字;(2)调用b

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

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

11、编程网络编程常州大学信息学院常州大学信息学院函数调用:int socket(int family,int type,int protocol);说明:family参数一般取AF_INET,protocol参数一般取0。函数返回Socket描述符,返回-1表示出错。27“协议”与“family”及“type”域的可能组合 FamilyTypeProtocol具体协议AF_INETAF_INETAF_INETAF_INETSOCK_DGRAMSOCK_STREAMSOCK_RAWSOCK_RAWIPPROTO_UDPIPPROTO_TCPIPPROTO_ICMPIPPROTO_RAWUDPTCPI

12、CMPIPAF_NSAF_NSAF_NSAF_NSSOCK_STREAMSOCK_SEQPACKETSOCK_RAWSOCK_RAWNSPROTO_SPPNSPROTO_SPPNSPROTO_ERRORNSPROTO_RAWSPPSPPError Protocol(raw)28网络编程网络编程常州大学信息学院常州大学信息学院应用示例:TCP:sockfd=socket(AF_INET,SOCK_STREAM,0);UDP:sockfd=socket(AF_INET,SOCK_DGRAM,0);29网络编程网络编程常州大学信息学院常州大学信息学院Socket配置:配置:bind()功能:将本地地

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

14、地址,以便服务器可以用这个有效的地址送回响应。31网络编程网络编程常州大学信息学院常州大学信息学院监听:监听:listen()功能:监听已经绑定的端口。需要在此前调用bind()函数,否则由系统指定一个随机的端口。函数:int listen(int sockfd,int queue_length);说明:queue_length用于指定接收队列的长度,也就是在Server程序调用accept函数之前最大允许进入的连接请求数,多余的连接请求将被拒绝,典型取值为5。32网络编程网络编程常州大学信息学院常州大学信息学院操作系统Web 服务器2.bind(80)801.socket()3.listen

15、()Listenqueue服务器初始化服务器初始化33网络编程网络编程常州大学信息学院常州大学信息学院连接:连接:connect()功能:建立与服务器的连接。函数:int connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen);说明:servaddr是一个sockaddr结构,用于指定所要连接的服务器的地址(Server的IP地址和端口号)。addrlen指明sockaddr结构的大小。34网络编程网络编程常州大学信息学院常州大学信息学院OS1.socket()Web 服务器2.bind(80)3.listen(

16、)80Listenqueue客户connect()Requestfrom(IP,port)建立与服务器的连接建立与服务器的连接35网络编程网络编程常州大学信息学院常州大学信息学院操作系统Web 服务器80Listen队列客户1客户3客户2客户请求在listen队列中获取先进先出服务(排队)服务器忙服务器忙36网络编程网络编程常州大学信息学院常州大学信息学院接受连接:接受连接:accept()功能:响应客户的连接请求,建立与客户端的连接。产生一个新的socket描述符来描述该连接,这个连接用来与发起该连接请求的客户交换数据。函数:int accept(int sockfd,struct sock

17、addr*addr,int addrlen);说明:addr将在函数调用后填入对方(客户端)的地址信息,如对方的IP、端口等。37网络编程网络编程常州大学信息学院常州大学信息学院操作系统Web 服务器80Listen队列客户 1客户3客户2客户请求在listen队列中获取先进先出服务accept()已连接的socketaccept()调用调用 38网络编程网络编程常州大学信息学院常州大学信息学院服务器都可工作在两种不同的方式:循环方式(iterative mode)在计算机中一次只运行一个服务器进程。当有多个客户进程请求服务时,服务器进程就按请求的先后顺序依次做出响应。并发方式(concurr

18、ent)在计算机中同时运行多个服务器进程,每一个服务器进程对某个特定的客户进程做出响应。服务器的两种工作方式服务器的两种工作方式39网络编程网络编程常州大学信息学院常州大学信息学院发送和接收发送和接收 在完成了上述的初始化工作后,就可以开始传输数据了。面向连接的发送和接收:send()和 recv()无连接的发送和接收:sendto()和recvfrom()40网络编程网络编程常州大学信息学院常州大学信息学院1、send()功能:用于TCP协议中发送。函数:int send(int sockfd,char*buf,int len,int flags);说明:函数返回已发送的字节数,返回-1表示

19、出错。send缺省是阻塞函数,直到发送完毕或出错。注意:如果函数返回值与参数len不相等,则剩余的未发送信息需要再次发送。41网络编程网络编程常州大学信息学院常州大学信息学院flags参数参数 Flags一般情况下设置为0。但可以选择下列设置:MSG_DONTROUTE:表示不使用指定路由,对send、sendto有效MSG_PEEK:对recv,recvfrom有效,表示读出网络数据后不清除已读的数据MSG_OOB:对发送接收都有效,表示发送或接受加急数据42网络编程网络编程常州大学信息学院常州大学信息学院2、recv()功能:用于TCP协议中接收。函数:int recv(int sockf

20、d,char*buf,int len,int flags);说明:函数返回实际接收到的字节数,返回-1表示出错。recv缺省是阻塞函数,直到接收到信息或出错才返回。43网络编程网络编程常州大学信息学院常州大学信息学院3、sendto()功能:用于UDP协议中发送。函数:int sendto(int sockfd,char*buf,int nbytes,int flags,struct sockaddr*to,int addrlen);说明:函数返回已发送的字节数,返回-1表示出错。sendto缺省是阻塞函数,直到发送完毕或出错。注意:如果函数返回值与参数nbytes不相等,则剩余的未发送信息需

21、要再次发送。44网络编程网络编程常州大学信息学院常州大学信息学院4、recvfrom()功能:用于UDP协议中接收。函数:int recvfrom(int sockfd,char*buf,int nbytes,int flags,struct sockaddr*from,int*addrlen);说明:函数返回实际接收的字节数,返回-1表示出错。recvfrom是阻塞函数,直到接收到信息或出错。45网络编程网络编程常州大学信息学院常州大学信息学院关闭关闭Socket 1、close()功能:关闭特定的socket连接。函数:int close(int sockfd);46网络编程网络编程常州大

22、学信息学院常州大学信息学院2、shutdown()功能:可以单方面的中断连接,即禁止某个方向的信息传递。函数:int shutdown(int sockfd,int how);说明:参数how:0-禁止接收信息。1-禁止发送信息。2-接收和发送都被禁止,与close()函数效果相同。47网络编程网络编程常州大学信息学院常州大学信息学院五、其他五、其他Socket系统调用系统调用getpeername()功能:返回和给定套接字相连的对方对等层进程名。函数:int getpeername(int sockfd,struct sockaddr*peer,int*addrlen);说明:参数peer是

23、一个指向struct sockaddr或者struct sockaddr_in的指针。48网络编程网络编程常州大学信息学院常州大学信息学院getsockname()功能:返回和一个套接字相联系的本地名字。函数:int getsockname(int sockfd,struct sockaddr*addr,int*addrlen);说明:addr用来存放返回的本地地址;addrlen存放的是返回的地址长度。49网络编程网络编程常州大学信息学院常州大学信息学院gethostname()功能:获取主机名。函数:int gethostname(char*hostname,size_t size);说明

24、:hostname是一个存放主机名字的字符数组;返回的hostname可以作为gethostbyname()的参数。50网络编程网络编程常州大学信息学院常州大学信息学院gethostbyname()功能:获取本地IP地址。函数:struct hostent*gethostbyname(const char*name);说明:gethostbyname()返回一个指向hostent结构的指针,或者是一个NULL指针表示错误。51网络编程网络编程常州大学信息学院常州大学信息学院字节排序字节排序 在字节顺序不一致时可以用下列的4种函数来进行转换。#include#include u_long hto

25、nl(u_long hostlong);u_short htons(u_long hostlong);u_long ntohl(u_long hostlong);u_chort ntohs(u_long hostlong);52网络编程网络编程常州大学信息学院常州大学信息学院字节操作字节操作 处理各种套接字地址结构中有协议多字节的字段。Bcopy(char*src,char*dest,int nbytes);字符串拷贝 Bzero(char*dest,int nbytes);把指定数量的空字节写入指定的目的地址。int bcmp(char*ptr1,char*ptr2,int nbytes);

26、对任意两个字符串进行比较。53网络编程网络编程常州大学信息学院常州大学信息学院IP地址格式转换地址格式转换 下列两个函数用于在Internet的用小数点分隔的十进制IP地址与二进制IP地址之间进行转换。#include#include#include unsigned long inet_addr(const char*cp);char*inet_ntoa(struct in_addr in);54网络编程网络编程常州大学信息学院常州大学信息学院有关有关socket选项的系统调用选项的系统调用 int setsockopt(int sockfd,int level,int optname,ch

27、ar*optval,int optlen);int getsockopt(int sockfd,int level,int optname,char*optval,int optlen);说明:sockfd是一个套接字描述符,level指定由系统中哪一个程序来解释选择项。optname是选择项的名字,optval是一个取或存放选择项的指针(缓冲区),optlen指定缓冲区的长度。55网络编程网络编程常州大学信息学院常州大学信息学院阻塞和非阻塞阻塞和非阻塞 阻塞函数在完成其指定任务以前不允许程序调用另一个函数。而非阻塞可以立即完成。int select(int numfds,fd_set*rea

28、dfds,fd_set*writefds,fd_set*exceptfds,struct timeval*timeout);56网络编程网络编程常州大学信息学院常州大学信息学院 说明:numfds是监视的文件描述符集数目。readfds,writefds,exceptfds都是socket事件集合,分别代表有数据可读、有数据要写、发生异常的socket集合。timeout是select的等待时间限制。返回值:在socket集合中准备好的socket个数。57网络编程网络编程常州大学信息学院常州大学信息学院socket集合集合集合变量类型:fd_set 集合变量运算宏:FD_ZERO(*set)清空socket集合FD_SET(s,*set)将s加入socket集合FD_CLR(s,*set)从socket集合去掉sFD_ISSET(s,*set)判断s是否在socket集合中58

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

当前位置:首页 > 教育专区 > 大学资料

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

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