소켓 프로그래밍에서 AF_INET과 PF_INET의 차이점은 무엇입니까?


205

소켓 프로그래밍에서 AF_INET과 PF_INET의 차이점은 무엇입니까?

나는에 AF_INET과 PF_INET를 사용하여 사이에 혼동하고 있습니다 socket()bind().

또한, IP 주소를 sin_addr필드 에 제공하는 방법은 무엇입니까?


인터넷을 검색하기 만하면됩니다 : 하나의 결과는 다음과 같습니다
Op De Cirkel

나는 이것도 궁금했다. 서로 다른 코더 사이의 소켓 호출에서 호환 적으로 사용되는 것 같습니다.
Matt

@MattH 둘 다 새로운 Linux 커널과 동일합니다. 아래 Duke의 답변에서 동일하게 찾을 수 있습니다.
SP Sandhu

답변:


250

Beej의 유명한 네트워크 프로그래밍 가이드 는 다음과 같은 멋진 설명을 제공합니다.

일부 문서에는 신비한 "PF_INET"에 대한 언급이 있습니다. 이것은 자연에서 거의 보이지 않는 이상한 에테르 짐승이지만, 여기에서 조금 분명히 할 수도 있습니다. 오래 전에는 주소 패밀리 ( "AF_INET"의 "AF"가 나타내는)가 해당 프로토콜 패밀리가 참조한 여러 프로토콜 ( "PF_INET"의 "PF"가 나타내는 것)을 지원할 수 있다고 생각했습니다. ).
그런 일은 없었습니다. 오 잘 따라서 올바른 작업은 struct sockaddr_in에서 AF_INET을 사용하고 socket () 호출에서 PF_INET을 사용하는 것입니다. 그러나 실제로는 어디에서나 AF_INET을 사용할 수 있습니다. 그리고 그것이 W. Richard Stevens가 그의 저서에서하는 것이므로, 제가 여기서 할 것입니다.


68

Linux 커널 소스 코드에서 PF_INET과 AF_INET이 동일하다는 것을 알았습니다. 다음 코드는 Linux 커널 3.2.21 트리의 204 행에있는 include / linux / socket.h 파일에서 가져온 것입니다.

/* Protocol families, same as address families. */
...
#define PF_INET     AF_INET

듀크, 이전 커널에서도 동일합니다. 3.0 이전의 커널을 의미합니까?
SP Sandhu

1
내가 아는 것처럼, 모든 버전의 커널과 libc에서 PF_ * == AF_ *
Duke

리눅스 이외의 플랫폼에서도 마찬가지입니까?
좋은 사람

1
포함 된 헤더 파일을 확인해야합니다. :)
Duke

Ubuntu / Debian에서 AF 정의를 찾았습니다/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
Petr Javorik

48
  • AF = 주소 패밀리
  • PF = 프로토콜 제품군

의미 AF_INET는 인터넷 주소, 구체적으로 IP 주소를 의미합니다. PF_INET프로토콜에서 일반적으로 소켓 / 포트를 가리 킵니다.

socket (2)bind (2) 의 매뉴얼 페이지를 읽으십시오 . 를 들어 sin_addr필드, 단지 그것을 설정하기 위해 다음과 같은 것을 할 :

struct sockaddr_in addr;
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr); 

@codemac 덕분에 addr.sin_addr.s_addr = inet_addr ( "127.0.0.1"); 그러나 inet_pton ()은 무엇입니까?
SP Sandhu

또한 man 페이지의 경우 man bind (2) 또는 man bind ()를 입력하면 터미널에 예기치 않은 토큰 '('오류가 발생하지만 man bind는 bash 내장에서 bind에 대한 설명을 제공합니다. bind ()에 대한 man 페이지를 얻는 방법. bind () 함수?
SP Sandhu

@ jatt.beas : 구문은 man <section> <topic>예를 들어, man 2 bind.
Frerich Raabe

11

실제로 AF_와 PF_는 같습니다. Wikipedia에 몇 가지 단어가 있습니다.

소켓 인터페이스의 원래 설계 개념은 프로토콜 유형 (가족)과 각각 사용할 수있는 특정 주소 유형으로 구분됩니다. 프로토콜 패밀리는 여러 가지 주소 유형을 가질 수있는 것으로 계획되었습니다. 주소 유형은 PF_ 대신 접두사 AF_를 사용하여 추가 기호 상수로 정의되었습니다. AF_ 식별자는 프로토콜 패밀리가 아닌 주소 유형을 구체적으로 다루는 모든 데이터 구조에 사용됩니다. 그러나 이러한 프로토콜과 주소 유형의 분리 개념은 구현 지원을 발견하지 못했으며 AF_ 상수는 해당 프로토콜 식별자에 의해 간단하게 정의되어 AF_ 대 PF_ 상수 사이의 구별은 실질적인 실질적인 결과가 아니라는 기술적 논거가되었습니다. 실제로 두 가지 형식을 올바르게 사용하는 데 많은 혼란이 있습니다.


4

AF_INET = 주소 형식, 인터넷 = IP 주소

PF_INET = 패킷 형식, 인터넷 = IP, TCP / IP 또는 UDP / IP

AF_INET은 작성중인 소켓 (이 경우 인터넷 프로토콜 주소)에 사용되는 주소 패밀리입니다. 예를 들어, Linux 커널은 UNIX 소켓 및 IPX와 같은 29 개의 다른 주소 계열과 IRDA 및 Bluetooth와의 통신 (AF_IRDA 및 AF_BLUETOOTH)을 지원하지만 이러한 낮은 수준에서 사용하는 것은 의심됩니다.

대부분의 경우 네트워크를 통한 소켓 프로그래밍을 위해 AF_INET을 사용하는 것이 가장 안전한 옵션입니다.

즉, AF_INET은 인터넷의 주소, 구체적으로 IP 주소를 나타냅니다.

PF_INET은 프로토콜에서 일반적으로 소켓 / 포트를 가리 킵니다.


3

중요한 상황이 있습니다.

socket()Cygwin에서 AF_INET을 전달하면 소켓이 임의로 재설정되거나 재설정되지 않을 수 있습니다. PF_INET을 전달하면 연결이 올바르게 작동합니다.

Cygwin에서 자기 인정 하듯이 소켓 프로그래밍에 대한 큰 혼란이지만, 그것은 이다 AF_INET과 PF_INET가 동일하지 않은 현실 세계 케이스.


6
설명 해주십시오. #define PF_INET AF_INETCygwin 's에서 찾을 수 socket.h있습니다.
Lorne의 후작

3

헤더 파일을 확인하면 문제가 해결됩니다. 시스템 컴파일러가 있는지 확인할 수 있습니다.

내 시스템의 경우 AF_INET == PF_INET

AF == 주소 패밀리 및 PF == 프로토콜 패밀리

주소 패밀리와 동일한 프로토콜 패밀리

여기에 이미지 설명을 입력하십시오


1
/usr/src/linux-headers-X.X.X-XX-generic/include/linux/socket.h
noobninja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.