C 언어 ping 명령의 (a)

 

네트워크 ICMP 프로토콜에 대한 ping 명령 :

ICMP 소개는 여기를 참조 소개 : https://www.cnblogs.com/wanghao-boke/p/11670473.html

 

네트워크 주소 정보

주소 정보, 말했다 :

네트워크 주소 정보를 전송하는 단계 :

  • 패밀리 주소 (IPv6의 또는 IPv4 주소 가족 기준)
  • IP 주소
  • 포트 번호

 

기록 주소 정보에 관련 구조를 사용합니다 :

구조체 를 sockaddr_in { 
    상기 sin_family sa_family_t      // 주소 패밀리 
    sin_port uint16_t;         // 포트 번호 
    구조체 sin_addr in_addr를 단계;           // 32 비트 IP 주소 
                  sin_zero를 정보 [ 8. ];     // 사용 안함 
} 

구조체 in_addr를 { 
    의 s_addr in_addr_t 단계;         // 32 비트 IP 어드레스 
} 

구조체 in_addr를 { 
    의 s_addr in_addr_t;         // 32 비트 IP 주소 
} 

#DEFINE in_addr_t uint32_t     // 부호 INT 32

 

당신은 다음과 같은 구조를 사용할 수 있습니다 :

구조체 {SOCKADDR 
    sin_family sa_family_t;      // 주소 패밀리 
              sa_data을 [ 14 ]; // IP 주소와 포트 
};

 

Sa_data 회원 정보는 IP 주소와 포트 번호, 나머지 0을 채우기가 포함되어 저장.

사용에 주소 다음은 네트워크 프로그래밍에 전달 된 구조 형 구조체 SOCKADDR 구조로 전환 구조 정의 정보를 sockaddr_in을 사용하여 구조체.

 

호스트 엔디안 바이트 순서 네트워크

 

연산 처리부 (CPU), 메모리 공간 내에 저장된 4 바이트의 정수 값은 여러 가지 방법이있다.

4 바이트 정수 값 1로 이진수로 표현 될 수있다
00000000 00000000 0,000,000,000,000,001

그리고 CPU를 저장 역순으로 어떤 장소에서

00000001 00000000 00000000 00000000

 

분석 데이터라고 CPU 두 방식

빅 - 엔디안 : 상위 바이트가 낮은 주소에 저장됩니다.

리틀 엔디안 : 위 주소는 상위 바이트에 저장된다

 

빅 엔디안 컨벤션 통합 데이터 전송 네트워크에 일관된 방식으로, 전송 및 분석 데이터를 호스트 CPU를 모두 수신하기 위해,이 규칙은 네트워크 바이트 순서라고한다.

 

따라서, 데이터 전송 네트워크 전에 요구가 네트워크 데이터를 수신하고, 전송 네트워크 전에 데이터 배열 변환 엔디안 포맷보다 크게 네이티브 바이트 포맷을 변환 할 필요가 그 이후의 처리이다. 이 단계는 관련 기능을 처리하는 것이다.

변수 데이터 유형의 IP 주소와 포트로 가득 우리가 그리드를 변환 할 필요를 sockaddr_in 구조를 구조체.

다음과 같은 방법의 상세한 엔디안 변환 기능 :

부호 짧은 htons (서명 단편 ); 
부호 짧은 ntohs (서명 단편 ); 
부호 길이   htonl (부호 길이 ); 
부호 길이   ntohl (부호 길이 );

htonl / htons는, h는 (호스트) 호스트 바이트 순서를 나타내고, n은 (네트워크) 네트워크 바이트 순서를 나타내고, s의 단편이고, L은 길이 (긴 리눅스 int 형과 같은 단지 4 바이트)를 지칭한다.

 

예 :

/ * TEST.C * / 
#INCLUDE <STDIO.H> 
#INCLUDE <ARPA / inet.h> INT 의 main () 
{ 
    부호 짧은 호스트 = 0x1234 ; 
    서명되지 않은 짧은 그물; 
    부호는 hostl = 0x12345678 ; 
    서명되지 않은 NETL; 
    그물 = htons (호스트); 
    NETL = htonl (hostl); 
    의 printf ( " 호스트 순서 짧은 % 번호 X \ n " , 호스트); 
    의 printf ( " 네트워크 주문 짧은 % 번호 X \ n " , 그물); 
    의 printf (




" 호스트하기 위해 긴 : % # X \ n " , hostl); 
    의 printf ( " 네트워크 주문 긴 % 번호 X \ n " , NETL); 

    반환  0 ;   
}

 

결과 :

호스트 주문 짧은 : 0x1234

네트워크 주문 짧은 : 0x3412

긴 호스트 순서 : 0x12345678

긴 네트워크 순서 : 0x78563412

 

확장 :

리틀 엔디안 인텔 CPU 시스템에서 사용하는 표준입니다.

추천

출처www.cnblogs.com/wanghao-boke/p/12180697.html