1、简介(2)

1、协议无关性

 上一节的程序只能在IPv4上运行,因为我们分配并初始化一个sockaddr_in类型的结构,把该结构的协议族成员设置为AF_INET,并指定socket函数的第一个参数为AF_INET

为了使之能在IPV6上运行,则将上面程序修改如下,

如何在redhat上打开IPV6

http://www.jb51.net/LINUXjishu/206836.html

这篇文章主要介绍了Linux下配置IPv6地址的方法,需要的朋友可以参考下
 

Linux在内核版本2.2.0以后就支持IPv6了,可查看/proc/net/if_inet6文件是否存在以确定你的系统是否支持IPv6  如果没有,可尝试如下命令加载IPv6模组: 
# modprobe ipv6 
成功加载后就可以使用IPv6环境了,系统会自动获得IPv6地址。 
IPv6相关命令: 
# ifconfig eth0 inet6 add 2001:da8:2004:1000:202:116:160:41/64 (手工添加配置固定IPv6地址)  # route -A inet6 add default gw 2001:da8:2004:1000::1 (添加默认路由)  # ping6 ipv6.scau.edu.cn  PING ipv6.scau.edu.cn(2001:da8:2004:1000:202:116:160:48) 56 data bytes  64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=0 ttl=64 time=0.020 ms  64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=1 ttl=64 time=0.019 ms  64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=2 ttl=64 time=0.014 ms  这个显示表明IPv6已配置成功。 
Linux设置isatap隧道配置IPv6  Linux 设置如下:  ip tunnel add sit1 mode sit remote 192.168.253.49 local a.b.c.d  ifconfig sit1 up  ifconfig sit1 add 2001:da8:2004:2301:0:5efe:a.b.c.d  route -A inet6 add ::/0 fe80::5efe:192.168.253.49  注意: 上面的 a.b.c.d 请使用你的真实IPv4地址代替 
配置好之后 ifconfig后应该看到一个2001:da8:2004:2301 为前缀的v6地址,hostid为5efe:a.b.c.d,其中a.b.c.d为你的真实的IPV4地址。
以下补充内容:
Debian

复制代码
代码如下:
vi /etc/network/interfaces # /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) # The loopback interface # automatically added when upgrading auto lo iface lo inet loopback auto eth0 iface eth0 inet6 static    address 2001:da8:2:10d::2    netmask 64    up route -A inet6 add default gw 2001:da8:2:10d::1 dev $IFACE iface eth0 inet static    address 58.1.4.74    netmask 255.255.255.0 up route add default gw 58.1.4.1 dev $IFACE 

Redhat CentOS Fedora

复制代码
代码如下:
[root@server4 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 # Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet DEVICE=eth0 BOOTPROTO=none HWADDR= 00:09 :3D:22:E1:40 IPADDR=202.120.1.1 NETMASK=255.255.255.240 ONBOOT=yes GATEWAY=202.120.1.254 TYPE=Ethernet USERCTL=no IPV6INIT=yes PEERDNS=yes IPV6ADDR=2001:da8:8003:801:202:120:1:1

静态默认网关设置

复制代码
代码如下:
[root@server4 ~]# vi /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=yes HOSTNAME=server4 GATEWAY=202.120.1.254 IPV6_DEFAULTGW=2001:da8:8003:801::1%eth0 
上面代码的运行没有成功,在于没有输入正确的ipv6的服务器地址
2、错误处理:包裹函数
在任何现实世界的程序都必须检查每个函数调用是否返回错误。当发生错误时,就调用我们自己的err_quit或err_sys函数输出一个出错消息并终止程序的运行。我们可以通过定义包裹函数来缩短程序。每个包裹函数完成实际的函数调用,检查返回值,并在发生错误时终止进程。我们约定包裹函数名是实际函数名的首字母大写形式。如
sockfd = socket(AF_INET,SOCK_STREAM,0);它的包裹函数如下
int Socket(int family,int type,int protocol)
{
  int n;
  if((n=socket(family,type,protocol))<0)
              err_sys("socket error");
  return (n);
}
Unix errno值
只要一个Unix函数(例如某个套接字函数)中有错误发生,全局变量errno就被置为一个指明该错误类型的正直,函数本身则通常返回-1。err_sys查看errno变量的值并输出相应的出错消息,例如当errno值等于ETIMEDOUT时,将输出“Connection timed out”(连接超时)。
errno的值只在函数发生错误时设置。如果函数不返回错误,errno的值就没有定义。errno的所有正数错误值都是常值,具有以“E”开头的全大写字母名字,并通常在<sys/errno.h>头文件中定义。值0不表示任何错误。
在全局变量中存放errno值对于共享所有全局变量的多个线程并不适合。
书中诸如“connect函数返回ECONNREFUSED”这样的句子简明表达以下意思:该函数返回一个错误(通常函数返回值为-1),同时errno被置为指定的常值。
 
一个简单的时间获取服务器程序
这个服务器函数可以与上一节的客户程序一起使用!!
程序如下:
为什么会这样???
OSI模型
描述一个网络中各个协议层的常用方法是使用国际标准化组织(ISO)的计算机通信开放系统互联(OSI)模型
 
为什么套接字提供的是从OSI模型的顶上三层(网际协议的应用层)进入传输层的接口?这样设计有两个理由,理由一:是顶上三层处理具体网络应用(如FTP、Telnet或HTTP)的所有细节,却对通信细节了解很少;底下四层对具体网络应用了解不多,却处理所有的通信细节:发送数据,等待确认,给无序到达的数据排序,计算并验证校验和,等等。理由二是顶上三层通常构成所谓的用户进程,底下四层却通常作为操作系统内核的一部分提供。Unix与其他现代操作系统都提供用户进程与内核的机制,由此可见,第4层和第5层之间的接口是构建API的自然位置。
 
BSD网络支持历史
 
测试用网络及主机
网络拓扑的发现
1)netstat -i 提供网络接口的信息;-n标志以输出数值地址,而不是试图把他们反向解析成名字。
2)netstat -r 展示路由表,也是另一种确定接口的方法。通常指定-n标志以输出数值地址,它还给出默认路由器的IP地址。
3)有了各个网络接口的名字,执行ifconfig就可获得每个接口的详细信息。
4)找出本地网络中众多主机的IP地址的方法之一是,针对从上一步找到的本地接口的广播地址执行ping命令。
ping -b 192.168.1.255
 
Unix标准
POSIX(可移植操作系统接口)是Portable Operating System Interface的缩写。它并不是单个标准,而是由IEEE(电气与电子工程师学会)开发的一系列标准。
最后一个标准是在2000年被认可的IEEE Std 1003.1g:Protocol-independent interfaces(PII)。它是联网API标准,它定义了两个API,并称他们为详尽网络接口(Detailed Network Interface,DNI)。
DNI/Socket,基于4.4BSD的套接字API。
DNI/XTI,基于X/Open的XPG4规范。
 
开放团体的背景
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/gary-guo/p/5977718.html