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_*。
你可以理解成變數換了個名字。