当前位置: 首页 > Linux

《Linux网络开发必学教程》3_IP地址深入讲解

时间:2023-04-06 19:34:57 Linux

问:网络编程接口中一些参数的含义是什么?sock=socket(PF_INET,SOCK_STREAM,0);socket参数详情intsocket(intdomain,inttype,intprotocol);参数含义域中使用的协议族信息socket类型套接字数据传输类型信息设备间通信协议信息socket()中的域参数(协议族)PF_INET→IPv4互联网协议族PF_INET6→IPv6互联网协议族PF_LOCAL→本地通信协议族PF_PACKET→底层数据收发协议PF_IPX→Novell专用协议(InternetpacketswitchingProtocol)...注:不同协议中的地址表示可能不同。地址类型必须与网络编程中的协议类型相匹配。socket()中的类型和协议参数type:用于指定协议类型SOCK_STREAM:流式数据(TCP)SOCK_UGRAM:消息式数据(UDP)协议:用于指定协议族遵循的具体协议。域和类型几乎可以唯一确定一个协议。因此,该参数通常为0,即:0代表指定的域和类型关于端口号和IP地址的默认协议端口号是一个2字节的数据(无符号)0-1024因为特定的端口是预定义的(分配给特定的application)IP地址是一个4字节的无符号地址族(可分离的IP地址分为网络ID和主机ID两部分4字节,那么如何区分网络ID和主机ID呢?IP地址和子网掩码是一起使用来区分网络标识符和主机标识符。子网掩码的表达形式也是4字节整数(无符号)。子网掩码用于从IP地址中提取网络标识符(&运算)In-深入理解子网掩码假设:子网掩码为M.N.P.Q,则子网中可用IP地址数n=(256-M)*(256-N)*(256-P)*(256-Q)例子:IP地址211.99.34.33,掩码255.255.2555.248,因此:211.99.34.33子网有8个IP地址子网地址:211.99.34.32广播地址:211.99.34.396可分配地址:211.99.34.33...211.99.34.38注:子网地址即网络标识ip地址211.99.34.33,掩码255.255.225.248说明211.99.34.33所在的子网有8个IP地址,8=2^3(2的3次方),所以Y=32-3=29可以表示为211.99.34.33/29【缩写形式】注:29为32位子网掩码的高位,计算IP地址为192.168.3.44,掩码为255.255.255.0问:什么是子网地址?广播地址是什么?有多少地址可用?什么是简明记法?答:子网地址:192.168.3.44广播地址:192.168.3.255可用地址:254[256-0(子网地址)-255(广播地址)]简明表示:192.168.3.44/24特殊地址0.0.0.0/0-保留,常用于表示“默认网络”127.0.0.0/8-Loopback地址,常用于本地软件发送测试255.255.255.255/32-广播地址网络编程中的地址类型intsock=0;structsockaddr_inaddr={0};sock=socket(PF_INET,SOCK_STREAM,0);//协议族,协议族if(sock==-1){pritnf("socketerror\n");返回;}addr.sin_family=AF_INET;//AddressFamily,地址族addr.sin_addr.s_addr=inet_addr("192.168.3.241");addr.sin_addr.port=htons(8899);if(connect(sock,(structsockaddr*)&addr,sizeof(addr))==-1){printf("连接错误\n");return-1;}问:(structsockaddr*)&addr强制类型转换不会有问题吗?地址数据类型分析structsockaddr可以理解为顶级地址类型的父类,其内存布局与子类相同相关函数#include函数原型函数说明in_addr_tinet_addr(constchar*strptr);将IP字符串转换为整数intinet_aton(constchar*cp,struct_addr*inp);将IP字符串转换为符合网络字节序的整数,成功返回1,失败返回0char*inet_ntoa(structin_addrin)将符合网络字节序的整数地址转换为字符串编程实验:地址函数实验#include#include#include#include#include#include#include#includeintmain(){unsignedintaddr=inet_addr("1.2.3.4");结构in_addr地址1={0x09080706};结构in_addr地址2={0x05040302};char*s1=inet_ntoa(addr1);char*s1_s=strcpy(malloc(32),s1);char*s2=inet_ntoa(addr2);char*s2_s=strcpy(malloc(32),s2);printf("地址=%x\n",地址);printf("addr1=%x\n",addr1.s_addr);printf("addr2=%x\n",addr2.s_addr);printf("s1=%s\n",s1);printf("s2=%s\n",s2);//注意这里!!printf("s1==s2:%d\n",s1==s2);//注意这里!!printf("s1_s=%s\n",s1_s);printf("s2_s=%s\n",s2_s);printf("s1_s==s2_s:%d\n",s1_s==s2_s);if(inet_aton("D.T.Software",&addr1)){//注意这里!!printf("addr1=%x\n",addr1.s_addr);}免费(s1_s);免费(s2_s);return0;}outputaddr=4030201addr1=9080706addr2=5040302s1=2.3.4.5s2=2.3.4.5//注意转换结果被覆盖了!!s1==s2:1//相同的地址两次!!s1_s=6.7.8.9s2_s=2.3.4.5s1_s==s2_s:0遗留问题:如何增强服务器能力,同时支持多客户端?什么是多播?什么是广播?