IP로 내부망과 외부망을 구분할 수 있나요?
내부 IP가 192로 시작하거나 172로 시작합니다.
외부 IP가 다른 것으로 시작합니다.
시작--실행--cmd를 입력하세요 --입력하고 ipconfig/all을 입력하면 dns가 표시되며 ipaddress는 외부 네트워크 주소입니다.
tcp/ip 프로토콜에서는 3개의 IP 주소 영역이 개인 주소로 예약되어 있습니다. :
10.0.0.0/8:10.0.0.0~10.255.255.255
172.16.0.0/12:172.16.0.0~172.31.255.255
192.168.0.0/16: 192.168.0.0~192.168.255.255
예약된 주소를 사용하는 네트워크는 내부적으로만 통신할 수 있으며 다른 네트워크와 상호 연결할 수 없습니다. 외부 세계와 통신하려면 게이트웨이를 통해 외부 세계와 통신해야 하며, 여기서는 NAT가 사용되며 통신을 보장하기 위해 사용되는 프록시 메커니즘은 NAPT 기술입니다.
또한 일부 광대역 사업자는 비공개 주소를 사용하여 사용자에게 할당하지만 라우팅 설정으로 인해 인터넷의 다른 사용자는 이러한 IP에 액세스할 수 없습니다. IP의 위 두 부분은 인트라넷 IP라고 할 수 있습니다. IP의 다음 부분은 이번에 논의하지 않습니다.
귀하의 컴퓨터에 있는 네트워크 인터페이스의 IP 주소가 위의 예약된 주소 범위 내에 있으면 인트라넷 모드에 있음을 확인할 수 있습니다.
NAT에서는 전체 서비스 연결이 내부 네트워크에서 외부 네트워크로 능동적으로 시작되어야 하며, 외부 네트워크의 사용자는 다음을 제외하고는 내부 네트워크의 서비스에 대한 연결 요청을 직접(적극적으로) 시작할 수 없습니다. NAT(모두)에 있습니다. 포트 매핑은 서비스 포트에 대한 게이트웨이에서 수행됩니다. NAT 방식을 사용하려면 가장 바깥쪽 게이트웨이에 하나 이상의 공용 IP가 있어야 하며, [202.108.22.5]와 같이 표시된 IP로 외부 서버에 액세스할 수 있어야 합니다.
추적 완료.
3) 프로그래밍 구현
이 시스템의 모든 IP 주소 목록을 가져오고 IP 목록을 분석합니다.
1) 목록에 LAN IP만 있는 경우 다음을 의미합니다. 내부망에 있습니다;
2) 목록에 LAN IP와 공인 IP가 있으면 게이트웨이라는 뜻이고,
3) LAN IP만 있으면 게이트웨이입니다. 목록에 공개 IP가 있으면 독립 IP라는 의미입니다.
//여기서 다른 플랫폼은 고려되지 않습니다. 테스트는 inet 아키텍처에서 수행되며 입력 IP는 호스트 바이트 순서입니다.
// 0xa -- "10.0.0.0"> >24 ; 0xc0a8--"192.168.0.0.">>16; 0x2b0--"127.17.0.1">>22
int isInnerIP( uint32_t a_ip )
{ p>
int bValid = -1;
if( (a_ip>>24 == 0xa) || (a_ip>>16 == 0xc0a8) || (a_ip>>22 == 0x2b0 ) )
{
bValid = 0;
}
bValid를 반환;
}
int isInnerIP( char* a_strip )
{
return 0;
}
IP 관련 애플리케이션
//이 시스템의 모든 IP 주소 목록을 가져오고 각각 문자열 및 정수 형식으로 표시합니다.
int getHostIP() //return int
{ p>
struct sockaddr_in localAddr, destAddr;
structhostent* h;
char temp[128];
int nRect = gethostname(temp, 128);
printf("ipaddr src3 is: %s/n", temp);
if(nRect !=0)
{ p> p>
printf("error");
}
h = gethostbyname(temp);
if(h)
{
for(int nAdapter=0; h->h_addr_list[nAdapter]; nAdapter++)
{
memcpy(&destAddr.sin_addr. s_addr, h->h_addr_list[nAdapter], h->h_length);
// 기기의 IP 주소를 출력합니다.
printf("주소 문자열: %s/n ", inet_ntoa( destAddr.sin_addr)); // 주소 문자열 표시
printf("Address int: %d/n", destAddr.sin_addr.s_addr); // 정수로 변환
}
}
0을 반환;
}
/
/문자열 IP가 유효한지 확인
int isCheckTrue(char* Strip)
{
int value;
for( int i = 0; i < strlen(strip); i++)
{
// 입력된 문자가 모두 입력되었는지 확인합니다.
// IP 주소가 숫자
if(strip[i] == '.')
계속;
if(isdigit(strip[i]) == 0)< / p>
{
반환 -1;
}
}
반환 0;
}
//문자열 IP를 정수 IP로 변환
int str2intIP(char* Strip) //int ip 반환
{
int intIP;
if(!(intIP = inet_addr(strip)))
{
perror("inet_addr failed./n")
-1 반환;
}
intIP 반환;
}