CH8_Socket编程.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《CH8_Socket编程.ppt》由会员分享,可在线阅读,更多相关《CH8_Socket编程.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、设计、制作设计、制作:谭献海谭献海Email:socketsocket(套接字)套接字)Socket APInARPAnUC BerkeleynBSD unix/Berkeley unixnDe facto standardnExamplenServernClient一个本地主机建立或拥有的应用程序,操作系统控制下的,与其它(远程)应用进程之间发送和接收数据的接口socket通信协议应用程序接口(应用程序接口(APIs)-依赖于操作系统和编程语言UNIX:BerkeleySockets(C语言)SystemVTransportLayerInterface(TLI)(C语言)WINDOWS:WI
2、NSOCK客户端nsocket 是进行程序间通讯(IPC)的 BSD 方法。n客户将插头插入一个服务器端口n建立一个双向的连接管道服务器插口(port)socketsocket的抽象表示的抽象表示一些Socket编程的概念n流(Stream)n连接(Connection)n阻塞(Block)、非阻塞(Non-block)n同步(Synchronous)、异步(asynchronous)nIP地址(IP Address)n字节顺序(Bytes Order)n带外数据(Outband Data)需要用到的头文件n数据类型:#includen函数定义:#includeBerkeley Socket
3、常用函数列表n网络连接函数n获取/设置socket的参数或信息n转换函数网络连接函数nsocketnbindnconnectnlistennacceptnselectnrecv,recvfromnsend,sendtonclose,shutdown获取/设置socket的参数或信息ngethostbyaddr,gethostbynamengethostnamengetpeernamengetprotobyname,getprotobynumberngetservbyname,getservbyportngetsocknamengetsockopt,setsockoptnioctl转换函数nIP
4、地址转换ninet_addr()ninet_ntoa()n字节顺序转换nhtons()-Host to Network Shortnhtonl()-Host to Network Longnntohs()-Network to Host Shortnntohl()-Network to Host Longsocket address structures for socket address structures for Internet,XNS and Unix familiesInternet,XNS and Unix families Structsockaddr_inStructsoc
5、kaddr_usstructsockaddr_unFamily2-byte port 4-byte netid,hosted(unused)Family4-byte net ID6-byte host ID2-byte port(unused)FamilyPathname(up to 108 bytes)socket addressnThe family is one of nAF_UNIXUnix internal protocolsnAF_INETInternet protocolsnAF_NSXerox NS protocolsnAF_IMPLINKIMP link layern其中,A
6、F_ 代表“address family”nSocket地址的数据部分根据不同的地址类型来解释,常见的地址类型是internet、XNS和UNIX。n对于使用最多的INTERNET簇,其网络地址主要包括两大部分:端口号、IP地址,它的地址结构在中定义数据结构:sockaddr_inInternet地址struct sockaddr_in short int sin_family;/*Address family*/unsigned short int sin_port;/*Port number*/*16-bit port number,network byte ordered*/struct
7、 in_addr sin_addr;/*Internet address*/*32-bit netid/hosted(IP)地址,network byte ordered*/unsigned char sin_zero 8;/*unused*/;该结构与sockaddr兼容,供用户填入参数程序中实际只填写sockaddr_in结构struct sockaddr_in my_addr;my_addr.sin_family=AF_INET;my_addr.sin_port=htons(3490);/*short,NBO*/my_addr.sin_addr.s_addr =inet_addr(132
8、.241.5.10);bzero(&(my_addr.sin_zero),8);注意:sin_addr.s_addr填本机IP地址,如果此项填INADDR_ANY时,表示自动取本机IP填入该项(仅用于Server)n创建一个socketnSocket描述符与Linux中的文件描述符类似,也是一个int型的变量n函数调用:nint socket(int family,int type,int protocol);n函数返回Socket描述符,返回-1表示出错nfamily参数一般取AF_INET,protocol参数一般取0n应用示例:nTCP:sockfd=socket(AF_INET,SOC
9、K_STREAM,0);nUDP:sockfd=socket(AF_INET,SOCK_DGRAM,0);socket()socket()调用调用“协议”与“family”及“type”域的可能组合 FamilyTypeProtocolAntualprotocolAF_INETAF_INETAF_INETAF_INETSOCK_DGRAMSOCK_STREAMSOCK_RAWSOCK_RAWIPPROTO_UDPIPPROTO_TCPIPPROTO_ICMPIPPROTO_RAWUDPTCPICMPIPAF_NSAF_NSAF_NSAF_NSSOCK_STREAMSOCK_SEQPACKETS
10、OCK_RAWSOCK_RAWNSPROTO_SPPNSPROTO_SPPNSPROTO_ERRORNSPROTO_RAWSPPSPPErrorProtocol(raw)n在服务器上运行,给socket指定一个众所周知的(well-known)端口地址nint bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen)IP 地址+端口号bind()bind()调用调用 如果调用成功,则返回值为0,如果调用失败返回值为-1,并设定相应的错误代码errno。最常见的错误是该端口已经被其他程序绑定。需要注意的一点:在Linux系统中
11、,1024以下的端口(即众所周知的端口)只有拥有root权限的程序才能绑定bind()bind()调用调用nnBind()系统调用主要用处:nA)服务员向系统注册它的众所周知的地址,它告诉系统:“这是我的地址(服务),所有以这个地址接收的报文都交给我,由我来服务。”面向连接和无连接的服务员在接受顾客的请求之前都必须做这一步。nB)顾客可为它自己注册一个特定的地址,以便通信的对方(服务员)可以用这个有效的地址送回响应,这就像在信封上要写明回信地址的道理一样。n开始监听已经绑定的端口n需要在此前调用bind()函数,否则由系统指定一个随机的端口nint listen(int sockfd,int
12、queue_length);n接收队列n一个新的Client的连接请求先被放在接收队列中,等待Server程序调用accept函数接受该连接请求nqueue_length用于指定接收队列的长度,也就是在Server程序调用accept函数之前最大允许进入的连接请求数,多余的连接请求将被拒绝,典型取值为5listen()listen()调用调用操作系统Web 服务器2.bind(80)801.socket()3.listen()Listenqueue服务器初始化服务器初始化n建立与服务器的连接nint connect(int sockfd,const struct sockaddr*servad
13、dr,socklen_t addrlen)nservaddr是事先填写好的结构,用于指定所要连接的服务器的地址(Server的IP地址和端口号)。connect()connect()调用调用OS1.socket()Web 服务器2.bind(80)3.listen()80Listenqueue客户connect()Requestfrom(IP,port)建立与服务器的连接建立与服务器的连接操作系统Web 服务器80Listen队列客户1客户3客户2客户请求在listen队列中获取先进先出服务(排队)服务器忙服务器忙accept()accept()naccept()函数用于响应客户的连接请求,建
14、立与客户端的连接n产生一个新的socket描述符来描述该连接n这个连接用来与发起该连接请求的Client交换信息nint accept(int sockfd,struct sockaddr*addr,int addrlen);naddr将在函数调用后被填入连接对方(客户端)的地址信息,如对方的IP、端口等。naccept缺省是阻塞函数,如果队列中没有连接请求等待,那么就会使调用方阻塞,直到有一个连接请求到达。操作系统Web 服务器80Listen队列客户 1客户3客户2客户请求在listen队列中夺取先进先出服务accept()已连接的socketaccept()accept()调用调用 ac
15、cept()accept()的使用的使用include include#include#include#include#include#define MYPORT 80/*the port users will be connecting to*/#define MYPORT 80/*the port users will be connecting to*/#define BACKLOG 5/*how many pending connections queue will#define BACKLOG 5/*how many pending connections queue will ho
16、ld*/main()int sockfd,new_fd;/*listen on sock_fd,new connection on new_fd*/struct sockaddr_in my_addr;/*my address information*/struct sockaddr_in their_addr;/*connectors address information*/int sin_size;sockfd=socket(AF_INET,SOCK_STREAM,0);/*do some error checking!*/accept()accept()my_addr.sin_fami
17、ly=AF_INET;/*host byte order*/my_addr.sin_port=htons(MYPORT);/*short,network byte order*/my_addr.sin_addr.s_addr =INADDR_ANY;/*auto-fill with my IP*/bzero(&(my_addr.sin_zero),8);/*zero the rest of the struct*/*did you remember your error checking?*/bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struc
18、t sockaddr);listen(sockfd,BACKLOG);sin_size=sizeof(struct sockaddr_in);new_fd=accept(sockfd,&their_addr,&sin_size);printf(”对方地址:%sn,inet_ntoa(their_addr.sin_addr);n服务器都可工作在两种不同的方式:n循环方式(iterative mode)在计算机中一次只运行一个服务器进程。当有多个客户进程请求服务时,服务器进程就按请求的先后顺序依次做出响应。n并发方式(concurrent)在计算机中同时运行多个服务器进程,每一个服务器进程对某个特
19、定的客户进程做出响应。服务器的两种工作方式循环型服务员代码循环型服务员代码intsockfd,newsockfd;if(sockfd=socket()0)err_sys(“socketerror”);if(bind(sockfd,)0)err_sys(“binderror”);if(listen(sockfd,5)0)err_sys(“listenerror”);for(;)newsockfd=accept(sockfd,);/*blocks*/if(newsockfd0)err_sys(“accepterror”);doit(newsockfd);/*processtherequest*/c
20、lose(newsockfd);并发型服务员代码并发型服务员代码 intsockfd,newsockfd;if(sockfd=socket()0)err_sys(“socketerror”);if(bind(sockfd,)0)err_sys(“binderror”);if(listen(sockfd,5)0)err_sys(“listenerror”);for(;)newsockfd=accept(sockfd,);/*blocks*/if(newsockfd0)err_sys(“accepterror”);if(fork()=0)/*child*/close(sockfd);doit(ne
21、wsockfd);/*processtherequest*/exit(0);close(newsockfd);/*parent*/发送和接收发送和接收q在完成了上述的初始化工作后,就可以开始传输数据了。q面向连接的发送和接收面向连接的发送和接收:send()andrecv()q无连接协议的发送和接收:无连接协议的发送和接收:sendto()和和recvfrom()recv用于TCP协议中接收信息intrecv(intsockfd,void*buf,intlen,intflags);Buf:指向容纳接收信息的缓冲区的指针Len:接收缓冲区的大小Flags:接收标志(其含义将在后面介绍)函数返回实
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CH8_Socket 编程
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内