《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程

上传人:E**** 文档编号:89428033 上传时间:2019-05-25 格式:PPT 页数:16 大小:100.52KB
返回 下载 相关 举报
《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程_第1页
第1页 / 共16页
《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程_第2页
第2页 / 共16页
《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程_第3页
第3页 / 共16页
《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程_第4页
第4页 / 共16页
《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程》由会员分享,可在线阅读,更多相关《《Linux/UNIX网络编程》-甘刚-电子教案 第02章 基本套接口编程(16页珍藏版)》请在金锄头文库上搜索。

1、基本套接字编程,主要内容,套接字基础 套接字地址结构 套接字基本函数,套接字基础,网络编程接口有两个发展方向:Socket,TLI 套接字是一种网络API,程序员可以用之开发网络程序。,进程1,进程2,网络编程接口(socket),网络通信协议服务接口(TCP/IP),底层通信协议和网络介质,套接字类型,套接字支持多种通信协议: Unix:Unix系统内部协议 INET:IP版本4 INET6:IP版本6 Linux支持多种套接字类型,即应用程序希望的通信服务类型 SOCKET_STREAM:双向可靠数据流,对应TCP SOCKET_DGRAM:双向不可靠数据报,对应UDP SOCKET_RA

2、W:是低于传输层的低级协议或物理网络提供的套接字类型,可以访问内部网络接口。例如接收和发送ICMP报,套接字地址结构(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 uin

3、t8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero8; ;,这些结构在不同的系统上都有所不同,struct sockaddr_in server bzero( server.sin_addr.s_addr = htonl(INADDR_ANY) .,IPv6地址为128位。(netinet/in.h),套接字地址结构(IPv6),typedef uint16_t in_port_t; typedef unsigned short sa_family_t;

4、 struct in6_addr uint8_t s6_addr16; ;,struct sockaddr_in6 uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; ;,sin6_flowinfo成员分成三个字段: 低24位是流量标号; 下4位是优先级; 再下4位保留,IPv4与IPv6地址结构比较,长度,AF_INET6,16位端口号,32位流标签,128位IPv6地址,sockaddr_in6 ,长度,AF_IN

5、ET,16位端口号,32位IP地址,未用,sockaddr_in ,固定长度(16字节),固定长度(24字节),通用套接字地址结构,由于套接字函数需接收来自不同协议的地址结构,ANSI的办法是使用通用的指针类型,即(void *).套接字函数方法是定义一个通用的套接字地址结构。,struct sockaddr uint8_t sa_len; sa_family_t sa_family; char sa_data14; ;,这就要求调用套接字函数时,需将指向特定于协议的地址结构的指针类型转换成指向通用的地址结构的指针, 如: struct sockaddr_in serv bind(sockfd

6、, (struct sockaddr *),字节排序函数,为保证”大端“和”小端“字节序的机器之间能相互通信,需在发送多字节整数时,将主机字节序转换成网络字节序,或反之。,高序字节,低序字节,MSB(最高有效位)16位值 LSB,高序字节,低序字节,内存地址增大方向,内存地址增大方向,小端字节序,大端字节序,网络字节序,字节排序函数(cont.),#include uint16_t htons(uint16_t hostshort) uint32_t htonl(uint32_t hostlong) 均返回:网络字节序值 uint16_t ntohs(uint16_t netshort) ui

7、nt32_t ntohl(uint32_t netlong) 均返回:主机字节序值 h:主机 n:网络 s:短整数 l:长整数,字节操纵函数,#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

8、); void *memcpy(void *dest, const void *src, size_t nbytes); int memcmp(const void *ptr1, const void *ptr2, size_t nbytes) 上述三个函数属于ANSI C,地址转换函数,#include 将点分十进制数串转换成32位网络字节序二进制值。 int inet_aton(const char *cp, struct in_addr *inp); 返回:1-串有效,0-串有错 in_addr_t inet_addr(const char *cp); 返回:若成功,返回32位二进制的网

9、络字节序地址,若有错,则返回一个 常值INADDR_NONE(32位均为1). 过时函数 inet_aton函数将cp所指的字符串(点分十进制数串,如192.168.0.1)转换成32位的网络字节序二进制,并通过指针inp来存储。这个函数需要对字符串所指的地址进行有效性验证。但如果cp为空,函数仍然成功,但不存储任何结果。 inet_addr进行相同的转换,但不进行有效性验证,也就是说,所有232种可能的二进制值对inet_addr函数都是有效的。,地址转换函数(续),char *inet_ntoa(struct in_addr inaddr); 返回:指向点分十进制数串的指针 函数inet_

10、ntoa将32位的网络字节序二进制IPv4地址转换成相应的点分十进制数串。但由于返回值所指向的串留在静态内存中,这意味着函数是不可重入的。 需要注意的是这个函数是以结构为参数的,而不是指针。 上述三个地址转换函数都只能处理IPv4协议,而不能处理IPv6地址。,地址转换函数(cont.),#include int inet_pton(int family, const char *strptr, void *addrptr); 返回:1-成功,0输入无效,-1:出错 const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len); 返回:指向结果的指针成功,NULL出错 字母P和N分别代表presentation(地址的表达格式)和numeric(数值格式)。 family参数可以是AF_INET,也可以是AF_INET6。 长度参数len是目标的大小,如果太小无法容纳表达格式结果,则返回一个空指针。另外,目标指针调用前必须先由调用者分配空间。,

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

当前位置:首页 > 高等教育 > 大学课件

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