소켓 프로그래밍에서 AF_INET과 PF_INET의 차이점은 무엇입니까?
나는에 AF_INET과 PF_INET를 사용하여 사이에 혼동하고 있습니다 socket()
와 bind()
.
또한, IP 주소를 sin_addr
필드 에 제공하는 방법은 무엇입니까?
소켓 프로그래밍에서 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
/usr/src/linux-headers-<kernel_version>/include/linux/socket.h
의미 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);
man <section> <topic>
예를 들어, man 2 bind
.
실제로 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가 동일하지 않은 현실 세계 케이스.
#define PF_INET AF_INET
Cygwin 's에서 찾을 수 socket.h
있습니다.