Socket网络编程指导课件

上传人:我*** 文档编号:142133959 上传时间:2020-08-17 格式:PPT 页数:40 大小:203.50KB
返回 下载 相关 举报
Socket网络编程指导课件_第1页
第1页 / 共40页
Socket网络编程指导课件_第2页
第2页 / 共40页
Socket网络编程指导课件_第3页
第3页 / 共40页
Socket网络编程指导课件_第4页
第4页 / 共40页
Socket网络编程指导课件_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《Socket网络编程指导课件》由会员分享,可在线阅读,更多相关《Socket网络编程指导课件(40页珍藏版)》请在金锄头文库上搜索。

1、2020/8/17,1,Socket网络编程指导,2020/8/17,2,什么是Socket?,BSD Socket(伯克立套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。 Socket是独立于具体协议的网络编程接口。在ISO模型中,主要位于会话层和传输层。,2020/8/17,3,Socket的类型,流式套接字(SOCK_STREAM) 提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。 数据报式套接字(SOCK_DGRAM) 提供了一个无连接服务。数据

2、包以独立包形式被发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序无序。 原始式套接字(SOCK_RAW) 该接口允许对较低层次协议,如IP、ICMP直接访问。,2020/8/17,4,Socket所在层次示意图,Application program,Stream Socket Interface,TCP,UDP,Datagram Socket Interface,Raw Socket Interface,IP,Physical and data link layers,2020/8/17,5,基本套接字调用,创建套接字socket(); 绑定本机端口bind(); 建立连接conne

3、ct(); 接受连接accept(); 监听端口listen(); 数据传输send(), recv() 等; 关闭套接字close();,2020/8/17,6,Socket相关的数据结构,struct sockaddr_in short int sin_family; /* 通信类型 */ unsigned short int sin_port; /* 端口号,网络字节顺序*/ struct in_addr sin_addr; /* Internet 地址,网络字节顺序*/ unsigned char sin_zero8;/*没用*/ ; struct in_addr in_addr_t

4、s_addr; /* 存储32bit 的IP地址*/ ,2020/8/17,7,网络字节顺序和主机字节顺序,Big-Endian Byte Order:字节的高位在内存中放在存储单元的起始位置,00001010,00010111,00001110,00000110,00001010,00010111,00001110,00000110,Memory,Little-Endian Byte Order : 与Big-Endian相反,A,A+1,A+2,A+3,2020/8/17,8,Host byte order( Little-Endian ),16-bit,32-bit,Network by

5、te order(Big-Endian),16-bit,32-bit,htons(),ntohs(),htonl(),ntohl(),网络字节顺序和主机字节顺序的转换,2020/8/17,9,IP地址的转换,int inet_aton(const char* strptr, struct in_addr *addrptr); 从点状十进制到32位2进制的转换,如“202.38.64.185” 到 11001010,00100110,01000000,10111001 char *inet_ntoa(struct in_addr inadd); 与inet_aton()的功能相反,2020/8/

6、17,10,相关的内存操作函数,void *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个字节为零。,2020/8/17,11,域名和IP地址的转换,struct hostent *gethostbyname(const char *name)

7、;,struct hostent char *h_name; /* 主机的官方域名 */ char *h_aliases; /* 一个以NULL结尾的主机别名数组 */ int h_addrtype; /* 返回的地址类型,在Internet环境下为AF- INET */ int h_length; /* 地址的字节长度 */ char *h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/ ; #define h_addr h_addr_list0 /*在h-addr-list中的第一个地址*/,2020/8/17,12,建立Socket,int socket(int

8、 domain, int type, int protocol); 参数说明: domain:通信使用的协议族,即网络的类型,对于 TCP/IP来说,是AF_INET type: SOCK_STREAM / SOCK_DGRAM protocol: 通常为0 返回整形的socket描述符,如果出错,返回-1,2020/8/17,13,Socket的配置,Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket()函数时,将建立一个Socket,为一个Socket数据结构分配存储空间。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地主机地址和端口、远端主机

9、地址和端口。 在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端调用connect()函数在socket数据结构中保存本地和远端信息。 无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind()函数来配置本地信息。,2020/8/17,14,绑定Socket,int bind(int sockfd,struct sockaddr_in *my_addr, int addrlen); sockfd是socket()返回的socket描述符; my_addr是指向包含本机IP地址及端口号等信息的 sockaddr类型的指针; add

10、rlen一般被设置为sizeof(struct sockaddr_in) 成功被调用时返回0;出现错误时返回-1,2020/8/17,15,绑定前sockaddr_in的初始化,my_addr.sin_family = AF_INET; /选择网络类型为TCP/IP my_addr.sin_addr.s_addr = inet_addr(“210.45.64.222); my_addr.sin_port = htons( 8888 ); /选择端口8888 addr_len = sizeof(struct sockaddr_in); memset(,2020/8/17,16,建立连接(客户端)

11、,面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:int connect( int sockfd, struct sockaddr_in *serv_addr,int addrlen); serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度 成功则返回0,出现错误时返回-1,2020/8/17,17,建立连接(服务器端),服务器监听端口:listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。 int listen(

12、int sockfd, int backlog); backlog:请求连接队列的最大长度 成功返回0,出错返回-1,2020/8/17,18,建立连接(服务器端),accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。int accept(int sockfd, sockaddr_in *addr, int *addrlen); addr是指向sockaddr_in变量的指针,该变量存放提出连接请求服务的主机的信息 返回新的socket描述符,和请求连接进程的地址联系起来在新的socket描述符上进行数据传输操作。原来

13、的socket继续listen,2020/8/17,19,数据传输(1),send()和recv()这两个函数用于面向连接的socket上进行数据传输。 send()函数原型为: int send(int sockfd, const void *msg, int len, int flags); sockfd是用来传输数据的socket描述符;msg是指向要发送数据的指针;len是以字节为单位的数据长度;flags一般置为0 send() 返回实际发送的字节数,可能会少于希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当返回值与len不匹配时,应该进行处理。,202

14、0/8/17,20,数据传输(2),recv()函数原型为: int recv(int sockfd, void *buf, int len, unsigned int flags); buf 是存放接收数据的缓冲区;len是缓冲区的长度。flags也被置为0。 recv()返回实际接收的字节数,当出现错误时,返回-1,2020/8/17,21,数据传输(3),sendto()和recvfrom()用于在无连接的数据报socket方 式下进行数据传输。由于本地socket没有与远端机器建立连接,所以在发送数据时要指明目的地址。 sendto()函数原型为: int sendto(int soc

15、kfd, const void *buf,int buflen,unsigned int flags, const struct sockaddr_in *to, int tolen);,2020/8/17,22,数据传输(4),recvfrom()函数原型为: int recvfrom(int sockfd,void *buf,int buflen, unsigned int flags,struct sockaddr_in *from,int *fromlen); recvfrom()函数返回接收到的字节数,当出错时返回-1,2020/8/17,23,结束传输,close()函数用于释放s

16、ocket,停止在该socket上的任何数据操作:close(sockfd); 也可以调用shutdown() 来关闭该socket 该函数允许只停止某个方向上的数据传输,而一个方向上的数据传输继续进行。int shutdown(int sockfd,int how); 参数 how允许为shutdown操作选择以下几种方式: 0-不允许继续接收数据 1-不允许继续发送数据 2-不允许继续发送和接收数据, shutdown在操作成功时返回0,出错时返回-1。,2020/8/17,24,C/S结构,服务器端要先启动,提供相应服务:1:打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。2:等待客户请求到达该端口。3:接收到服务请求,处理该请求并发送应答信号。4:返回第二步,等待另一客户请求5:关闭服务器。,客户端:1、打开一通信通道,并连接到服务器所在主机的特定端口。2、向服务器发送服务请求报文,等

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号