ipv4源码
① ipv4与ipv6如何转换
IPv4:是互联网协议的第四版,同时也是第一个被广泛使用,构成现今互联网技术的基石的协议;
② IPv4与IPv6的区别是什么
IPv6与IPv4的区别主要有以下几点:
1.IPv6的地址空间更大。IPv4中规定IP地址长度为32,即有2^32-1个地址;而IPv6中IP地址的长度为128,即有2^128-1个地址。夸张点说就是,如果IPV6被广泛应用以后,全世界的每一粒沙子都会有相对应的一个IP地址。
2.IPv6的路由表更小。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。
3.IPv6的组播支持以及对流的支持增强。这使得网络上的多媒体应用有了长足发展的机会,为服务质量控制提供了良好的网络平台。
4.IPv6加入了对自动配置的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。
5.IPv6具有更高的安全性。在使用IPv6网络中,用户可以对网络层的数据进行加密并对IP报文进行校验,这极大地增强了网络安全。
③ LINUX 升级内核时报错
你是不是用发行版改动过的源代码编译的?如果是从 kernel.org 里下载的内核,应该不会出现这种情况。
我以前是用的红帽的内核。这个里面的选项依赖性很强,只有一点一点的试了。我的做法是 先用原生的 .config 文件编译,看能不能通过,再每次少改动一两个选项,试试看能不能编译。有一个能加速编译的工具 ccache 你右以考虑下。
1.项目前期工作(配置好环境)
2.发送端文件编写(见下面的send.cpp)
3.接收端文件编写(见下面的receive.cpp)
4.编译文件
(1)发送端
g++-osendsend.cpp-I/usr/local/include/jrtplib3/-ljrtp
(2)接收端
g++-oreceivereceive.cpp-I/usr/local/include/jrtplib3/-ljrtp
附录:
(1)send.cpp
[cpp]
#include"rtpsession.h"
#include"rtppacket.h"
#include"rtpudpv4transmitter.h"
#include"rtpipv4address.h"
#include"rtpsessionparams.h"
#include"rtperrors.h"
#include"rtpmemorymanager.h"
#ifndefWIN32
#include<netinet/in.h>
#include<arpa/inet.h>
#else
#include<winsock2.h>
#endif//WIN32
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<string>
//
//.Ifso,itdisplaysanerror
//messageandexists.
//
voidcheckerror(intrtperr)
{
if(rtperr<0)
{
std::cout<<"ERROR:"<<RTPGetErrorString(rtperr)<<std::endl;
exit(-1);
}
}
//
//Themainroutine
//
#ifdefRTP_SUPPORT_THREAD
classMyMemoryManager:publicRTPMemoryManager
{
public:
MyMemoryManager()
{
mutex.Init();
alloccount=0;
freecount=0;
}
~MyMemoryManager()
{
std::cout<<"alloc:"<<alloccount<<"free:"<<freecount<<std::endl;
}
void*AllocateBuffer(size_tnumbytes,intmemtype)
{
mutex.Lock();
void*buf=malloc(numbytes);
std::cout<<"Allocated"<<numbytes<<"bytesatlocation"<<buf<<"(memtype="<<memtype<<")"<<std::endl;
alloccount++;
mutex.Unlock();
returnbuf;
}
voidFreeBuffer(void*p)
{
mutex.Lock();
std::cout<<"Freeingblock"<<p<<std::endl;
freecount++;
free(p);
mutex.Unlock();
}
private:
intalloccount,freecount;
JMutexmutex;
};
#else
classMyMemoryManager:publicRTPMemoryManager
{
public:
MyMemoryManager()
{
alloccount=0;
freecount=0;
}
~MyMemoryManager()
{
std::cout<<"alloc:"<<alloccount<<"free:"<<freecount<<std::endl;
}
void*AllocateBuffer(size_tnumbytes,intmemtype)
{
void*buf=malloc(numbytes);
std::cout<<"Allocated"<<numbytes<<"bytesatlocation"<<buf<<"(memtype="<<memtype<<")"<<std::endl;
alloccount++;
returnbuf;
}
voidFreeBuffer(void*p)
{
std::cout<<"Freeingblock"<<p<<std::endl;
freecount++;
free(p);
}
private:
intalloccount,freecount;
};
#endif//RTP_SUPPORT_THREAD
intmain(void)
{
#ifdefWIN32
WSADATAdat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif//WIN32
MyMemoryManagermgr;
RTPSessionsess(&mgr);
uint16_tportbase,destport;
uint32_tdestip;
std::stringipstr;
intstatus,i,num;
//First,we'
std::cout<<"Enterlocalportbase:"<<std::endl;
std::cin>>portbase;
std::cout<<std::endl;
std::cout<<"EnterthedestinationIPaddress"<<std::endl;
std::cin>>ipstr;
destip=inet_addr(ipstr.c_str());
if(destip==INADDR_NONE)
{
std::cerr<<"BadIPaddressspecified"<<std::endl;
return-1;
}
//Theinet_,but
//,soweuseacallto
//ntohl
destip=ntohl(destip);
std::cout<<"Enterthedestinationport"<<std::endl;
std::cin>>destport;
std::cout<<std::endl;
std::cout<<":"<<std::endl;
std::cin>>num;
//Now,we'llcreateaRTPsession,setthedestination,sendsome
//packetsandpollforincomingdata.
;
RTPSessionParamssessparams;
//IMPORTANT:,otherwise
//
//Inthiscase,we',sowe'll
//putthetimestampunitto(1.0/10.0)
sessparams.SetOwnTimestampUnit(1.0/10.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
status=sess.Create(sessparams,&transparams);
checkerror(status);
RTPIPv4Addressaddr(destip,destport);
status=sess.AddDestination(addr);
checkerror(status);
for(i=1;i<=num;i++)
{
printf(" Sendingpacket%d/%d ",i,num);
//sendthepacket
status=sess.SendPacket((void*)"1234567890",10,0,false,10);
checkerror(status);
sess.BeginDataAccess();
//checkincomingpackets
if(sess.GotoFirstSourceWithData())
{
do
{
RTPPacket*pack;
while((pack=sess.GetNextPacket())!=NULL)
{
//Youcanexaminethedatahere
printf("Gotpacket! ");
//wedon'tlongerneedthepacket,so
//we'lldeleteit
sess.DeletePacket(pack);
}
}while(sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
#ifndefRTP_SUPPORT_THREAD
status=sess.Poll();
checkerror(status);
#endif//RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1,0));
}
sess.BYEDestroy(RTPTime(10,0),0,0);
#ifdefWIN32
WSACleanup();
#endif//WIN32
return0;
}
(2)receive.cpp
[cpp]viewplain
#include"rtpsession.h"
#include"rtppacket.h"
#include"rtpudpv4transmitter.h"
#include"rtpipv4address.h"
#include"rtpsessionparams.h"
#include"rtperrors.h"
#ifndefWIN32
#include<netinet/in.h>
#include<arpa/inet.h>
#else
#include<winsock2.h>
#endif//WIN32
#include"rtpsourcedata.h"
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<string>
//
//.Ifso,itdisplaysanerror
//messageandexists.
//
voidcheckerror(intrtperr)
{
if(rtperr<0)
{
std::cout<<"ERROR:"<<RTPGetErrorString(rtperr)<<std::endl;
exit(-1);
}
}
//
//Thenewclassroutine
//
classMyRTPSession:publicRTPSession
{
protected:
voidOnNewSource(RTPSourceData*dat)
{
if(dat->IsOwnSSRC())
return;
uint32_tip;
uint16_tport;
if(dat->GetRTPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTPDataAddress());
ip=addr->GetIP();
port=addr->GetPort();
}
elseif(dat->GetRTCPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTCPDataAddress());
ip=addr->GetIP();
port=addr->GetPort()-1;
}
else
return;
RTPIPv4Addressdest(ip,port);
AddDestination(dest);
structin_addrinaddr;
inaddr.s_addr=htonl(ip);
std::cout<<"Addingdestination"<<std::string(inet_ntoa(inaddr))<<":"<<port<<std::endl;
}
voidOnBYEPacket(RTPSourceData*dat)
{
if(dat->IsOwnSSRC())
return;
uint32_tip;
uint16_tport;
if(dat->GetRTPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTPDataAddress());
ip=addr->GetIP();
port=addr->GetPort();
}
elseif(dat->GetRTCPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTCPDataAddress());
ip=addr->GetIP();
port=addr->GetPort()-1;
}
else
return;
RTPIPv4Addressdest(ip,port);
DeleteDestination(dest);
structin_addrinaddr;
inaddr.s_addr=htonl(ip);
std::cout<<"Deletingdestination"<<std::string(inet_ntoa(inaddr))<<":"<<port<<std::endl;
}
voidOnRemoveSource(RTPSourceData*dat)
{
if(dat->IsOwnSSRC())
return;
if(dat->ReceivedBYE())
return;
uint32_tip;
uint16_tport;
if(dat->GetRTPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTPDataAddress());
ip=addr->GetIP();
port=addr->GetPort();
}
elseif(dat->GetRTCPDataAddress()!=0)
{
constRTPIPv4Address*addr=(constRTPIPv4Address*)(dat->GetRTCPDataAddress());
ip=addr->GetIP();
port=addr->GetPort()-1;
}
else
return;
RTPIPv4Addressdest(ip,port);
DeleteDestination(dest);
structin_addrinaddr;
inaddr.s_addr=htonl(ip);
std::cout<<"Deletingdestination"<<std::string(inet_ntoa(inaddr))<<":"<<port<<std::endl;
}
};
//
//Themainroutine
//
intmain(void)
{
#ifdefWIN32
WSADATAdat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif//WIN32
MyRTPSessionsess;
uint16_tportbase;
std::stringipstr;
intstatus,i,num;
//First,we'
std::cout<<"Enterlocalportbase:"<<std::endl;
std::cin>>portbase;
std::cout<<std::endl;
std::cout<<std::endl;
std::cout<<"Numberofsecondsyouwishtowait:"<<std::endl;
std::cin>>num;
//Now,we'llcreateaRTPsession,setthedestination
//andpollforincomingdata.
;
RTPSessionParamssessparams;
//IMPORTANT:,otherwise
//
//Inthiscase,we'.
sessparams.SetOwnTimestampUnit(1.0/8000.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
status=sess.Create(sessparams,&transparams);
checkerror(status);
for(i=1;i<=num;i++)
{
sess.BeginDataAccess();
//checkincomingpackets
if(sess.GotoFirstSourceWithData())
{
do
{
RTPPacket*pack;
while((pack=sess.GetNextPacket())!=NULL)
{
//Youcanexaminethedatahere
printf("Gotpacket! ");
//wedon'tlongerneedthepacket,so
//we'lldeleteit
sess.DeletePacket(pack);
}
}while(sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
#ifndefRTP_SUPPORT_THREAD
status=sess.Poll();
checkerror(status);
#endif//RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1,0));
}
sess.BYEDestroy(RTPTime(10,0),0,0);
#ifdefWIN32
WSACleanup();
#endif//WIN32
return0;
}
⑤ c#winform 为什么有时候获取不到ip,有时候获取的ip前有:: ,那位给个有效的源码
你取的可能是IPv6的地址。在某台机子上如果配置的网卡多或一个网卡设置了多个IP,就需要你自己判断一下哪个是你需要的IP。
System.Net.IPAddress[] address = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList;
//address数组中可能会有多个,如win7中除了ipv4还会有ipv6的,还有可能你设置了多个IP。
//自己判断下该取哪个数组中的IP地址。
string strIP = address[0].ToString();
⑥ python 判断是ipv6还是ipv4 inet
ipv4与ipv6地址如何转换的python解决办法
ipv4与ipv6地址如何转换的python解决办法。要想知道ipv4与ipv6地址转换的问题,首先要了解它的概念。
ipv4与ipv6地址是什么简单的来说一下:
IPv4:是互联网协议的第四版,同时也是第一个被广泛使用,构成现今互联网技术的基石的协议;
IPv6:是互联网工程任务组设计的用于替代现行版本IPv4的下一代IP协议;
目前IP协议的版本号是IPv4,它的下一个版本就是IPv6。
ipv4与ipv6地址如何转换的python解决办法,源码如下:(需要用到twisted.python.compat及struct和python socket方法)
import struct,socket
#import twisted.python.compat #导入twisted.python.compat 更方便
# ipv4数字地址
def ipv4_to_string(ipv4):
ipv4_n = socket.htonl(ipv4)
data = struct.pack('I', ipv4_n)
ipv4_string = socket.inet_ntop(socket.AF_INET, data)
return ipv4_string
def ipv4_from_string(ipv4_string):
data = socket.inet_pton(socket.AF_INET, ipv4_string)
ipv4_n = struct.unpack('I', data)
ipv4 = socket.ntohl(ipv4_n[0])
return ipv4
def ipv4_readable2int(ipv4):
return int(ipv4)
def ipv4_int2readable(ipv4):
return str(ipv4)
# ipv6用四个整数(tuple或用,分开的字符串)表示
def ipv6_to_string(ipv6):
ipv6_n = (socket.htonl(ipv6[0]),
socket.htonl(ipv6[1]),
socket.htonl(ipv6[2]),
socket.htonl(ipv6[3]))
data = struct.pack('IIII', ipv6_n[0], ipv6_n[1], ipv6_n[2], ipv6_n[3])
ipv6_string = socket.inet_ntop(socket.AF_INET6, data)
return ipv6_string
def ipv6_from_string(ipv6_string):
data = socket.inet_pton(socket.AF_INET6, ipv6_string)
ipv6_n = struct.unpack('IIII', data)
ipv6 = (socket.ntohl(ipv6_n[0]),
socket.ntohl(ipv6_n[1]),
socket.ntohl(ipv6_n[2]),
socket.ntohl(ipv6_n[3]))
return ipv6
def ipv6_tuple2readable(ipv6):
return str(ipv6[0]) + ',' + str(ipv6[1]) + ',' + str(ipv6[2]) + ',' + str(ipv6[3])
def ipv6_readable2tuple(ipv6):
return tuple(ipv6.split(','))
#win32 下实现 inet_pton 和 inet_ntop
def inet_ntop(family, ipstr):
if family== socket.AF_INET:
return socket.inet_ntoa(ipstr)
elif family== socket.AF_INET6:
v6addr = ':'.join(('%02X%02X' % (ord(i), ord(j)))
for i,j in zip(ipstr[::2], ipstr[1::2]))
return v6addr
#www.iplaypy.com
def inet_pton(family, addr):
if family== socket.AF_INET:
return socket.inet_aton(addr)
elif family== socket.AF_INET6:
if '.' in addr: # a v4 addr
v4addr = addr[addr.rindex(':')+1:]
v4addr = socket.inet_aton(v4addr)
v4addr = map(lambda x: ('%02X' % ord(x)), v4addr)
v4addr.insert(2, ':')
newaddr = addr[:addr.rindex(':')+1] + ''.join(v4addr)
return inet_pton(family, newaddr)
dbyts = [0]* 8 # 8 groups
grps = addr.split(':')
for i,v in enumerate(grps):
if v:
dbyts[i] = int(v, 16)
else:
for j, w in enumerate(grps[::-1]):
if w:
dbyts[7-j] = int(w, 16)
else:
break
break
return ''.join( (chr(i//256) + chr(i%256)) for i in dbyts)
else:
raise RuntimeError("What family?")
⑦ ipv4与ipv6如何转换计算方法是什么
ipv4与ipv6不需要进行转换,因为为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示。
计算方法:直接截取ipv6的后32b就是ipv4。
(7)ipv4源码扩展阅读:
IPv6与IPv4之间的过渡技术
IPv6不可能立刻替代IPv4,因此在相当一段时间内IPv4和IPv6会共存在一个环境中。要提供平稳的转换过程,使得对现有的使用者影响最小,就需要有良好的转换机制。
这个议题是IETF ngtrans工作小组的主要目标,有许多转换机制被提出,部分已被用于6Bone上。IETF推荐了双协议栈、隧道技术以及网络地址转换等转换机制:
一、IPv6/IPv4双协议栈技术
二、隧道技术
三、网络地址转换技术
网络地址转换(Network Address Translator,NAT)技术是将IPv4地址和IPv6地址分别看作内部地址和全局地址,或者相反。
例如,内部的IPv4主机要和外部的IPv6主机通信时,在NAT服务器中将IPv4地址(相当于内部地址)变换成IPv6地址(相当于全局地址),服务器维护一个IPv4与IPv6地址的映射表。
反之,当内部的IPv6主机和外部的IPv4主机进行通信时,则IPv6主机映射成内部地址,IPv4主机映射成全局地址。NAT技术可以解决IPv4主机和IPv6主机之间的互通问题 。
⑧ 2.6内核源码netfilter中NF_INET_PRE_ROUTING跟NF_IP_PRE_ROUTING啥关系
认真看头文件,头文件上面有说明。
两者的值是一样的。
NF_IP_*和NF_IP6_*都不能用在新的内核,内核/内核模块要用NF_INET_*。
我记得没错的话,这种转变是从2.6.25的内核开始,当时还没有NF_INET_*,全部都用NF_IP系列的。
现在,NF_IP_*只是为了兼容用户程序而保留的,一般应该用NF_INET_*。
你可以理解成变量换了个名字。