Socket网络编程指导.ppt

上传人:qwe****56 文档编号:79030697 上传时间:2023-03-19 格式:PPT 页数:40 大小:754.50KB
返回 下载 相关 举报
Socket网络编程指导.ppt_第1页
第1页 / 共40页
Socket网络编程指导.ppt_第2页
第2页 / 共40页
点击查看更多>>
资源描述

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

1、Socket网络编程指导网络编程指导2023/1/131/什么是什么是Socket?2023/1/132/37BSD Socket(伯克立套接字)是通过标准的(伯克立套接字)是通过标准的UNIX文文件描述符和其它程序通讯的一个方法,目前已经被广泛件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。移植到各个平台。Socket是独立于具体协议的网络编程接口。在是独立于具体协议的网络编程接口。在ISO模型模型中,主要位于会话层和传输层。中,主要位于会话层和传输层。Socket的类型的类型2023/1/133/37l流式套接字流式套接字(SOCK_STREAM)提供了一个面向连接,可靠的

2、数据传输服务,数据无差提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。免数据流超限;数据被看作是字节流,无长度限制。l数据报式套接字数据报式套接字(SOCK_DGRAM)提供了一个无连接服务。数据包以独立包形式被发送,提供了一个无连接服务。数据包以独立包形式被发送,不提供无差错保证不提供无差错保证,数据可能丢失或重复,并且接收顺序无数据可能丢失或重复,并且接收顺序无序。序。l原始式套接字原始式套接字(SOCK_RAW)该接口允许对较低层次协议,如该接

3、口允许对较低层次协议,如IP、ICMP直接访问。直接访问。2023/1/134/37 Socket所在层次示意图所在层次示意图Application programStreamSocketInterfaceTCPUDPDatagramSocketInterfaceRawSocketInterfaceIPPhysical and data link layers基本套接字调用基本套接字调用2023/1/135/37创建套接字创建套接字socket();绑定本机端口绑定本机端口bind();建立连接建立连接connect();接受连接接受连接accept();监听端口监听端口listen();数据

4、传输数据传输send(),recv()等等;关闭套接字关闭套接字close();Socket相关的数据结构相关的数据结构2023/1/136/37lstruct sockaddr_in short int sin_family;/*通信类型通信类型*/unsigned short int sin_port;/*端口号端口号,网络字节顺序网络字节顺序*/struct in_addr sin_addr;/*Internet 地址地址,网络字节顺序网络字节顺序*/unsigned char sin_zero8;/*没用没用*/;lstruct in_addr in_addr_t s_addr;/*存

5、储存储32bit 的的IP地址地址*/网络字节顺序和主机字节顺序网络字节顺序和主机字节顺序2023/1/137/37lBig-Endian Byte Order:字节的高位在内存中放在存储字节的高位在内存中放在存储单元的起始位置单元的起始位置0000101000010111000011100000011000001010000101110000111000000110Memoryl Little-Endian Byte Order:与与Big-Endian相反相反AA+1A+2A+32023/1/138/40Host byte order(Little-Endian)16-bit32-bitN

6、etwork byte order(Big-Endian)16-bit32-bithtons()ntohs()htonl()ntohl()网络字节顺序和主机字节顺序的转换网络字节顺序和主机字节顺序的转换IP地址的转换地址的转换2023/1/139/37int inet_aton(const char*strptr,struct in_addr *addrptr);从点状十进制到从点状十进制到32位位2进制的转换,如进制的转换,如“202.38.64.185”到到 11001010,00100110,01000000,10111001char *inet_ntoa(struct in_addr

7、inadd);与与inet_aton()的功能相反的功能相反相关的内存操作函数相关的内存操作函数2023/1/1310/37void*memset(void*buffer,int c,int count);把把buffer所指内存区域的前所指内存区域的前count个字节设置成字符个字节设置成字符c。void*memcpy(void*dest,void*src,unsigned int count);由由src所指内存区域复制所指内存区域复制count个字节到个字节到dest所指内存区所指内存区域。域。Void bzero(void*s,int n);置字节字符串置字节字符串s的前的前n个字节为

8、零。个字节为零。域名和域名和IP地址的转换地址的转换2023/1/1311/37struct hostent*gethostbyname(const char*name);struct hostent char*h_name;/*主机的官方域名主机的官方域名*/char *h_aliases;/*一个以一个以NULL结尾的主机别名数组结尾的主机别名数组*/int h_addrtype;/*返回的地址类型,在返回的地址类型,在Internet环境下为环境下为AF-INET*/int h_length;/*地址的字节长度地址的字节长度*/char *h_addr_list;/*一个以一个以0结尾的

9、数组,包含该主机的所有地结尾的数组,包含该主机的所有地址址*/;#define h_addr h_addr_list0 /*在在h-addr-list中的第一个地址中的第一个地址*/建立建立Socket2023/1/1312/37l int socket(int domain,int type,int protocol);l参数说明:参数说明:domain:通信使用的协议族,即网络的类型,对于:通信使用的协议族,即网络的类型,对于 TCP/IP来说,是来说,是AF_INET type:SOCK_STREAM/SOCK_DGRAM protocol:通常为通常为0 返回整形的返回整形的socke

10、t描述符,如果出错,返回描述符,如果出错,返回-1 Socket的配置的配置2023/1/1313/37lSocket描述符是一个指向内部数据结构的指针,它指向描描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用述符表入口。调用Socket()函数时,将建立一个函数时,将建立一个Socket,为一个为一个Socket数据结构分配存储空间。数据结构分配存储空间。l两个网络程序之间的一个网络连接包括五种信息:通信协两个网络程序之间的一个网络连接包括五种信息:通信协议、本地主机地址和端口、远端主机地址和端口。议、本地主机地址和端口、远端主机地址和端口。l在使用在使用socket进行网络传输

11、以前,必须配置该进行网络传输以前,必须配置该socket。面向连接的面向连接的socket客户端调用客户端调用connect()函数在函数在socket数据结构中保存本地和远端信息。数据结构中保存本地和远端信息。无连接无连接socket的客户端和服务端以及面向连接的客户端和服务端以及面向连接socket的服务端通过调用的服务端通过调用bind()函数来配置本地信息。函数来配置本地信息。绑定绑定Socket2023/1/1314/37lint bind(int sockfd,struct sockaddr_in*my_addr,int addrlen);sockfd是是socket()返回的返回

12、的socket描述符;描述符;my_addr是指向包含本机是指向包含本机IP地址及端口号等信息的地址及端口号等信息的 sockaddr类型的指针;类型的指针;addrlen一般被设置为一般被设置为sizeof(struct sockaddr_in)成功被调用时返回成功被调用时返回0;出现错误时返回;出现错误时返回-1 绑定前绑定前sockaddr_in的初始化的初始化2023/1/1315/37my_addr.sin_family=AF_INET;/选择网络类型为选择网络类型为TCP/IPmy_addr.sin_addr.s_addr=inet_addr(“210.45.64.222);my_

13、addr.sin_port=htons(8888);/选择端口选择端口8888addr_len=sizeof(struct sockaddr_in);memset(&my_addr.sin_zero,0,sizeof(my_addr.sin_zero);建立连接(客户端)建立连接(客户端)2023/1/1316/37面向连接的客户程序使用面向连接的客户程序使用connect函数来配置函数来配置socket并与并与远端服务器建立一个远端服务器建立一个TCP连接,其函数原型为:连接,其函数原型为:int connect(int sockfd,struct sockaddr_in *serv_add

14、r,int addrlen);serv_addr是包含远端主机是包含远端主机IP地址和端口号的指针;地址和端口号的指针;addrlen是远端地址结构的长度是远端地址结构的长度 成功则返回成功则返回0,出现错误时返回,出现错误时返回-1 建立连接(服务器端)建立连接(服务器端)2023/1/1317/37服务器监听端口:服务器监听端口:listen函数使函数使socket处于被动的监听模式,处于被动的监听模式,并为该并为该socket建立一个输入数据队列,将到达的服务请求建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。保存在此队列中,直到程序处理它们。int listen

15、(int sockfd,int backlog);backlog:请求连接队列的最大长度请求连接队列的最大长度成功返回成功返回0,出错返回,出错返回-1 建立连接(服务器端)建立连接(服务器端)2023/1/1318/37accept()函数让服务器接收客户的连接请求。在建立好输函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用入队列后,服务器就调用accept函数,然后睡眠并等待客函数,然后睡眠并等待客户的连接请求。户的连接请求。int accept(int sockfd,sockaddr_in*addr,int *addrlen);addr是指向是指向sockaddr_in变

16、量的指针,该变量存放提出连变量的指针,该变量存放提出连接请求服务的主机的信息接请求服务的主机的信息 返回新的返回新的socket描述符,和请求连接进程的地址联系起来描述符,和请求连接进程的地址联系起来在新的在新的socket描述符上进行数据传输操作。原来的描述符上进行数据传输操作。原来的socket继续继续listen 数据传输数据传输(1)2023/1/1319/37send()和和recv()这两个函数用于面向连接的这两个函数用于面向连接的socket上进行上进行数据传输。数据传输。send()函数原型为:函数原型为:int send(int sockfd,const void*msg,i

17、nt len,int flags);sockfd是用来传输数据的是用来传输数据的socket描述符;描述符;msg是指向要是指向要发送数据的指针;发送数据的指针;len是以字节为单位的数据长度;是以字节为单位的数据长度;flags一一般置为般置为0 send()返回实际发送的字节数,可能会少于希望发送的数返回实际发送的字节数,可能会少于希望发送的数据。在程序中应该将据。在程序中应该将send()的返回值与欲发送的字节数进的返回值与欲发送的字节数进行比较。当返回值与行比较。当返回值与len不匹配时,应该进行处理。不匹配时,应该进行处理。数据传输数据传输(2)2023/1/1320/37recv(

18、)函数原型为:函数原型为:int recv(int sockfd,void*buf,int len,unsigned int flags);buf 是存放接收数据的缓冲区;是存放接收数据的缓冲区;len是缓冲区的长度。是缓冲区的长度。flags也被置为也被置为0。recv()返回实际接收的字节数,当出现错误时,返回返回实际接收的字节数,当出现错误时,返回-1数据传输数据传输(3)2023/1/1321/37 sendto()和和recvfrom()用于在无连接的数据报用于在无连接的数据报socket方方 式下进行数据传输。由于本地式下进行数据传输。由于本地socket没有与远端机器建立连没有与

19、远端机器建立连接,所以在发送数据时要指明目的地址。接,所以在发送数据时要指明目的地址。sendto()函数原型为:函数原型为:int sendto(int sockfd,const void*buf,int buflen,unsigned int flags,const struct sockaddr_in*to,int tolen);数据传输数据传输(4)2023/1/1322/37recvfrom()函数原型为:函数原型为:int recvfrom(int sockfd,void*buf,int buflen,unsigned int flags,struct sockaddr_in *f

20、rom,int *fromlen);recvfrom()函数返回接收到的字节数,当出错时返回函数返回接收到的字节数,当出错时返回-1 结束传输结束传输 2023/1/1323/37close()函数用于释放函数用于释放socket,停止在该,停止在该socket上的任何数上的任何数据操作:据操作:close(sockfd);也可以调用也可以调用shutdown()来关闭该来关闭该socket该函数允许只停止某个方向上的数据传输,而一个方向上该函数允许只停止某个方向上的数据传输,而一个方向上的数据传输继续进行。的数据传输继续进行。int shutdown(int sockfd,int how);

21、参数参数 how允许为允许为shutdown操作选择以下几种方式:操作选择以下几种方式:0-不允许继续接收数据不允许继续接收数据 1-不允许继续发送数据不允许继续发送数据 2-不允许继续发送和接收数据,不允许继续发送和接收数据,shutdown在操作成功时返回在操作成功时返回0,出错时返回,出错时返回-1。C/S结构结构2023/1/1324/37服务器端要先启动,提供相应服务器端要先启动,提供相应服务:服务:1:打开一通信通道并告知本地:打开一通信通道并告知本地主机,它愿意在某一个公认地址上主机,它愿意在某一个公认地址上接收客户请求。接收客户请求。2:等待客户请求到达该端口。:等待客户请求到

22、达该端口。3:接收到服务请求,处理该请:接收到服务请求,处理该请求并发送应答信号。求并发送应答信号。4:返回第二步,等待另一客户:返回第二步,等待另一客户请求请求5:关闭服务器。:关闭服务器。客户端:客户端:1、打开一通信通道,、打开一通信通道,并连接到服务器所在主机的并连接到服务器所在主机的特定端口。特定端口。2、向服务器发送服务、向服务器发送服务请求报文,等待并接收应答;请求报文,等待并接收应答;继续提出请求继续提出请求3、请求结束后关闭通、请求结束后关闭通信通道并终止。信通道并终止。流程图流程图2023/1/1325/37TCP服务器端服务器端(循环服务器循环服务器)TCP客户端客户端s

23、ocket()bind()listen()accept()socket()send()connect()recv()recv()send()close()close()UDP服务器端服务器端UDP客户端客户端socket()bind()listen()recvfrom()sendto()socket()bind()close()close()简单的例子简单的例子2023/1/1326/37int sockfd,newsockfd,addr_len,sendnum;struct sockaddr_in my_addr,their_addr;char*msg=“welcome”;sockfd=so

24、cket(AF_INET,SOCK_STREAM,0);/建立建立socketmy_addr.sin_family=AF_INET;/选择网络类型为选择网络类型为TCP/IPmy_addr.sin_addr.s_addr=inet_addr(“210.45.64.222);my_addr.sin_port=htons(8888);/选择端口选择端口8888addr_len=sizeof(struct sockaddr_in);memset(&my_addr.sin_zero,0,sizeof(my_addr.sin_zero);bind(sockfd,(struct sockaddr*)&my

25、_addr,addr_len);/绑定绑定socketlisten(sockfd,10);/监听,等待连接,等待连接队列最大长度为监听,等待连接,等待连接队列最大长度为10简单的例子(续)简单的例子(续)2023/1/1327/37While(1)newsockfd=accept(sockfd,(struct sockaddr*)&my_addr,addr_len);sendnum=send(newsockfd,msg,strlen(msg)+1,0);close(newsockfd);close(sockfd);阻塞与非阻塞阻塞与非阻塞(1)2023/1/1328/37l阻塞函数:阻塞函数:

26、指其完成指定的任务之前不允许程指其完成指定的任务之前不允许程序调用另一个函数,在序调用另一个函数,在Windows下还会阻塞本线下还会阻塞本线程消息的发送。程消息的发送。eg:recv(),当当socket工作在阻塞模式的时候,如果没有数工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程会被挂起,直到有数据据的情况下调用该函数,则当前线程会被挂起,直到有数据为止。为止。l非阻塞函数:非阻塞函数:指操作启动之后,如果可以立即指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回。的错误

27、信息,不等待任务完成函数就返回。使用非阻塞使用非阻塞I/O的方式:的方式:select()例子例子:while(1)/执行循环执行循环 一边输出一边也不要忘了输入一边输出一边也不要忘了输入FD_ZERO(&wt_set);FD_ZERO(&rd_set);FD_CLR(s,&wt_set);FD_CLR(s,&rd_set);FD_SET(s,&wt_set);FD_SET(s,&rd_set);timeout.tv_sec=0;timeout.tv_usec=500000;z=select(s+1,&rd_set,&wt_set,NULL,&timeout);if(FD_ISSET(s,&r

28、d_set)/有数据可读有数据可读 z=recv(s,&recvBuff,sizeof recvBuff-1,0);2023/1/1329/37阻塞与非阻塞阻塞与非阻塞(2)2023/1/1330/37在在Berkeley socket函数部分中,不涉及网络函数部分中,不涉及网络I/O、本、本地端工作的函数是非阻塞函数地端工作的函数是非阻塞函数在在Berkeley socket函数部分中,网络函数部分中,网络I/O的函数是可的函数是可阻塞函数,也就是它们可以阻塞执行,也可以不阻塞阻塞函数,也就是它们可以阻塞执行,也可以不阻塞执行。这些函数都使用了一个执行。这些函数都使用了一个socket,如果

29、它们使用,如果它们使用的的socket是阻塞的,则这些函数是阻塞函数;如果它是阻塞的,则这些函数是阻塞函数;如果它们使用的们使用的socket是非阻塞的,则这些函数是非阻塞函是非阻塞的,则这些函数是非阻塞函数。数。并发服务器并发服务器2023/1/1331/37TCP服务器端服务器端(并发服务器并发服务器)socket()bind()listen()accept()send()recv()close()fork()/派生新进程派生新进程close()主进程在主进程在accept之之后派生新进程,然后后派生新进程,然后主进程继续主进程继续listen,处处理新的连接请求理新的连接请求 新进程自行

30、和客户新进程自行和客户端通信,新进程和主端通信,新进程和主进程抢占进程抢占CPUWinSock API2023/1/1332/37WinSock是一个基于是一个基于Socket模型的模型的API,在,在Microsoft Windows操作系统类中使用。操作系统类中使用。它在它在Berkeley接口函数的基础之上,还增加了基于接口函数的基础之上,还增加了基于消息驱动机制的消息驱动机制的Windows扩展函数。扩展函数。Winscok1.1只支持只支持TCP/IP网络网络,WinSock2.0增加增加了对更多协议的支持。了对更多协议的支持。Windows下的下的Socket编程编程(1)2023

31、/1/1333/37和和linux下基本相同,需要包含下基本相同,需要包含winsock2.h需要使用需要使用Ws_32.lib,可以用以下语句通告程序编,可以用以下语句通告程序编译时调用该库:译时调用该库:#pragma comment(lib,Ws2_32.lib);WinSock以以DLL的形式提供,在调用任何的形式提供,在调用任何WinSock API之前,必须调用函数之前,必须调用函数WSAStartup()进行初始化,最后,调用函数进行初始化,最后,调用函数WSACleanUp()作清理工作。作清理工作。Windows下的下的Socket编程编程(2)2023/1/1334/37W

32、SADATA wsd;/设置设置WINSOCK的版本的版本WORD wVersionRequested=MAKEWORD(2,2);WSAStartup(wVersionRequested,&wsd);/初始化初始化。WSACleanUp();Windows下的下的Socket编程编程(3)2023/1/1335/37MFC提供了两个类提供了两个类CAsyncSocket和和CSocket来来封装封装WinSock API,提供了更简单的网络编程接,提供了更简单的网络编程接口。口。CAsyncSocket在较低层次上封装了在较低层次上封装了WinSock API,缺省情况下,使用该类创建的,缺

33、省情况下,使用该类创建的socket是非阻是非阻塞的塞的socket,所有操作都会立即返回,如果没有,所有操作都会立即返回,如果没有得到结果,返回得到结果,返回WSAEWOULDBLOCK,表示,表示是一个阻塞操作。是一个阻塞操作。Windows下的下的Socket编程编程(4)2023/1/1336/37CSocket是是CAsyncSocket的派生类,缺省情况下的派生类,缺省情况下使用该类创建的使用该类创建的socket是非阻塞的是非阻塞的socket,但是,但是CSocket的网络的网络I/O是阻塞的,它在完成任务之后是阻塞的,它在完成任务之后才返回。才返回。CSocket的阻塞不是建

34、立在的阻塞不是建立在“阻塞阻塞”socket的基础的基础上,而是在上,而是在“非阻塞非阻塞”socket上实现的阻塞操作上实现的阻塞操作 网络编程作业要求网络编程作业要求2023/1/1337/37l不分组,每人独立完成。不分组,每人独立完成。l基于基于C/S或或P2P结构,使用结构,使用UDP或或TCP协议皆可。协议皆可。l最好使用基本最好使用基本SOCKET API,不反对使用不反对使用CAsyncSocket和和 CSocket类,但不准使用和传输相关的控件。类,但不准使用和传输相关的控件。l期末提交设计文档,源码,及可执行文件。期末提交设计文档,源码,及可执行文件。l提交时间为提交时间

35、为12月份,具体提交日期及提交方式待定。月份,具体提交日期及提交方式待定。可选题目可选题目IBBS发帖程序发帖程序通过通过term方式(方式(202.38.64.3:23)或者通过)或者通过web方式方式完成在完成在test版发一贴的功能(多发会被永久封账号)版发一贴的功能(多发会被永久封账号)Bbs账号和密码使用命令行参数或其他方式设置,不要账号和密码使用命令行参数或其他方式设置,不要直接写在程序里直接写在程序里对于对于term方式下的程序,要求能监视程序运行过程(也方式下的程序,要求能监视程序运行过程(也就是说在程序运行的时候要把服务器的输出打印到屏幕)就是说在程序运行的时候要把服务器的输

36、出打印到屏幕)Referrence:http协议协议:http:/en.wikipedia.org/wiki/HTTP2023/1/1338/37可选题目可选题目II完成一个完成一个HTTP服务器服务器使用使用HTTP 1.1协议协议支持最大至少支持最大至少10个并发连接(个并发连接(fork创建子进程)创建子进程)要求服务器程序运行以后,能在浏览器中访问文件,正要求服务器程序运行以后,能在浏览器中访问文件,正常显示常显示Web server的根目录使用命令行参数或者其他方式制定,的根目录使用命令行参数或者其他方式制定,不要写在程序代码里不要写在程序代码里文件不存在时返回浏览器文件不存在时返回浏览器404错误错误2023/1/1339/372023/1/1340/37谢谢谢谢

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

当前位置:首页 > 技术资料 > 其他杂项

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

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