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

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

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

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



답변

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

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


답변

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


답변

  • 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); 


답변

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

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


답변

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은 프로토콜에서 일반적으로 소켓 / 포트를 가리 킵니다.


답변

중요한 상황이 있습니다.

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

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


답변

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

내 시스템의 경우 AF_INET == PF_INET

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

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

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