Linux下套接字编程简介课件

上传人:我*** 文档编号:145239189 上传时间:2020-09-18 格式:PPT 页数:32 大小:333KB
返回 下载 相关 举报
Linux下套接字编程简介课件_第1页
第1页 / 共32页
Linux下套接字编程简介课件_第2页
第2页 / 共32页
Linux下套接字编程简介课件_第3页
第3页 / 共32页
Linux下套接字编程简介课件_第4页
第4页 / 共32页
Linux下套接字编程简介课件_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《Linux下套接字编程简介课件》由会员分享,可在线阅读,更多相关《Linux下套接字编程简介课件(32页珍藏版)》请在金锄头文库上搜索。

1、1,Linux网络编程,第三单元 套接字编程简介,2,第三单元 套接字编程简介,3.1套接字基础 3.2套接字的类型 3.3套接字地址结构 3.4套接字基本函数 3.5值结果参数,3,3.1套接字基础,网络编程接口有两个发展方向 Socket(BSD),TLI(SystemV) 套接字是一种网络API,程序员可以用之开发网络程序。,4,第三单元 套接字编程简介,3.1套接字基础 3.2套接字的类型 3.3套接字地址结构 3.4套接字基本函数 3.5值结果参数,5,3.2套接字的类型,套接字支持多种通信协议,如: Unix:Unix系统内部协议 INET:IP版本4 INET6:IP版本6 Li

2、nux支持多种套接字类型,即应用程序希望的通信服务类型,常用的有: SOCKET_STREAM:双向可靠数据流,对应TCP SOCKET_DGRAM:双向不可靠数据报,对应UDP SOCKET_RAW:是低于传输层的低级协议或物理网络提供的套接字类型,可以访问内部网络接口。例如接收和发送ICMP包,6,第三单元 套接字编程简介,3.1套接字基础 3.2套接字的类型 3.3套接字地址结构 3.4套接字基本函数 3.5值结果参数,7,3.3套接字地址结构,3.3.1 IPv4套接字地址结构 3.3.2 IPv6套接字地址结构 3.3.3 两种套接字地址结构的比较 3.3.4 通用套接字地址结构,8

3、,套接字地址结构(IPv4),大多数套接字函数需要一个指向套接字地址结构的参数,每个协议族都定义它自己的套接字地址结构,一般以”sockaddr_”开头,并以协议簇为后缀。(netinet/in.h),typedef uint32_t in_addr_t; typedef uint16_t in_port_t; typedef unsigned short sa_family_t; struct in_addr in_addr_t s_addr;,struct sockaddr_in uint8_t sin_len; sa_family_t sin_family; in_port_t sin_

4、port; struct in_addr sin_addr; char sin_zero8; ;,9,套接字地址结构(IPv4)举例,struct sockaddr_in server bzero( server.sin_addr.s_addr = htonl(INADDR_ANY) .,10,IPv6地址为128位。(netinet/in.h),套接字地址结构(IPv6),typedef uint16_t in_port_t; typedef unsigned short sa_family_t; struct in6_addr uint8_ts6_addr16; ;,struct sock

5、addr_in6 uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; ;,11,长度,AF_INET6,16位端口号,32位流标签,128位IPv6地址,sockaddr_in6 ,长度,AF_INET,16位端口号,32位IP地址,未用,sockaddr_in ,固定长度(16字节),固定长度(24字节),IPv4与IPv6地址结构比较,12,由于套接字函数需接收来自不同协议的地址结构,ANSI的办法是使用通用的指针

6、类型,即(void *).套接字函数方法是定义一个通用的套接字地址结构。,struct sockaddr uint8_t sa_len; sa_family_t sa_family; char sa_data14; ;,这就要求调用套接字函数时,需将指向特定于协议的地址结构的指针类型转换成指向通用的地址结构的指针, 如:struct sockaddr_in serv; bind(sockfd, (struct sockaddr *),通用套接字地址结构,13,第三单元 套接字编程简介,3.1套接字基础 3.2套接字的类型 3.3套接字地址结构 3.4套接字基本函数 3.5值结果参数,14,3.

7、4套接字基本函数,3.4.1 字节排序函数 3.4.2 字节操纵函数 3.4.3 IP地址转换函数,15,字节顺序,大于一个字节类型的数据在内存中的存放顺序 Little-Endian 小端,低位字节在内存低地址端,高位字节在内存高地址端。 Intel x86,AMD64,DEC VAX Big-Endian 大端,高位字节在内存低地址端,低位字节在内存高地址端。 Sun SPARC, Motorola 68000,Java Virtual Machine,16,字节排序函数,为保证”大端“和”小端“字节序的机器之间能相互通信,需在发送多字节整数时,将主机字节序转换成网络字节序,或反之。,高序

8、字节,低序字节,MSB(最高有效位)16位值 LSB,高序字节,低序字节,内存地址增大方向,内存地址增大方向,小端字节序,大端字节序,网络字节序,17,字节排序函数,#include uint16_t htons(uint16_t hostshort) uint32_t htonl(uint32_t hostlong) 均返回:网络字节序值 uint16_t ntohs(uint16_t netshort) uint32_t ntohl(uint32_t netlong) 均返回:主机字节序值 h:主机 n:网络 s:短整数 l:长整数,18,3.4套接字基本函数,3.4.1 字节排序函数 3

9、.4.2 字节操纵函数 3.4.3 IP地址转换函数,19,字节操纵函数,#include void bzero(void *dest, size_t nbytes); void bcopy(const void *src, void *dest, size_t nbytes); int bcmp(const void *src, void *dest, size_t nbytes); /*返回0则相同,非0不相同*/ 上述三个函数源自BSD void *memset(void *dest, int c, size_t len); void *memcpy(void *dest, const

10、void *src, size_t nbytes); int memcmp(const void *ptr1, const void *ptr2, size_t nbytes) 上述三个函数属于ANSI C,20,bzero举例,void bzero(void *dest, size_t nbytes); 参数: dest:要清0 的缓冲区首址 nbytes:要清0的字节个数 struct sockaddr_in server; 将server清0 bzero(,21,3.4套接字基本函数,3.4.1 字节排序函数 3.4.2 字节操纵函数 3.4.3 IP地址转换函数,22,地址转换函数-i

11、net_aton,#include 将点分十进制数串转换成32位网络字节序二进制值。 int inet_aton(const char *str, struct in_addr *numstr); 参数: str:字符串形式的IP地址 numstr:32位网络字节顺序的IP地址 struct in_addr in_addr_t s_addr; 返回:1-成功,0-失败 struct sockaddr_in server; inet_aton(127.0.0.1,23,地址转换函数-inet_addr,另一个点分十进制转换到网络字节顺序的二进制IP的函数 in_addr_t inet_addr(

12、const char *cp); 参数:点分十进制IP字符串 返回:若成功,返回32位二进制的网络字节序地址,若有错,则返回一个 常值INADDR_NONE(32位均为1). inet_addr认为所有的232个地址都有效,不进行有效性验证 struct sockaddr_in server; server.sin_addr.s_addr=inet_addr(“127.0.0.1”);,24,地址转换函数-inet_ntoa,#include 将32位的网络字节序二进制IPv4地址转换成点分十进制。 char *inet_ntoa(struct in_addr inaddr); 参数: ina

13、ddr:32位网络字节顺序的二进制IPv4地址。 返回值:指向点分十进制数串的指针。 struct sockaddr_in client; /假设通过accept函数已经将client赋值 printf(“%sn”,inet_ntoa(client.sin_addr);/输出客户端IP地址 上述三个地址转换函数都只能处理IPv4协议,而不能处理IPv6地址。,25,地址转换函数,#include int inet_pton(int family, const char *strptr, void *addrptr); 返回:1-成功,0输入无效,-1:出错 const char *inet_n

14、top(int family, const void *addrptr, char *strptr, size_t len); 返回:指向结果的指针成功,NULL出错 字母P和N分别代表presentation(地址的表达格式)和numeric(数值格式)。 family参数可以是AF_INET,也可以是AF_INET6。 长度参数len是目标的大小,如果太小无法容纳表达格式结果,则返回一个空指针。另外,目标指针调用前必须先由调用者分配空间。,26,27,第三单元 套接字编程简介,3.1套接字基础 3.2套接字的类型 3.3套接字地址结构 3.4套接字基本函数 3.5值结果参数,28,值-结果

15、参数概念,函数形式: 返回值 函数名(形参列表) 函数体 一般形参是调用函数向函数体传递的信息,返回值是函数体向调用函数返回值信息。 形参可以是某个变量的值,也可以是变量地址。 当形参是一个地址的时候,除了具有向函数体传递信息的作用外,还可以起到向调用函数返回信息的作用,此时这个形参就可以理解为值-结果参数,因为它在传递的过程中值也发生了变化。,29,值-结果参数举例,套接字相关函数中有些的形参就是包括值-结果参数的。 accept,recv,recvfrom,getsockname,getpeername等。,30,第三单元 小结,套接字的类型 套接字地址结构 IPv4,通用 套接字基本函数 小端,大端;转换函数 清0函数bzero IP地址转换inet_aton inet_ntoa 值结果参数 理解概念,具体函数后续学习中去感受。,31,作业,P20-P21 1. 2.,32,谢谢,

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

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

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