Skip to content

C:socket

create an endpoint for communication.

SYNOPSIS

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

AF vs PF

AF 와 PF의 차이점에 대하여 설명한다.

  • PF_INET: 프로토콜 체계(프로토콜 패밀리)중 하나이다.
  • AF_INET: 주소 체계(주소 패밀리)중 하나이다.

프로토콜 패밀리(Protocol Family)는 대표적으로 아래와 같은 종류가 있다. 이 들은 주소 구조체 안에 주소 패밀리를 정의할 때 사용합니다.

PF_INET

IPv4인터넷 프로토콜.

PF_INET6

IPv6인터넷 프로토콜.

PF_LOCAL

LOCAL 통신을 위한 UNIX 프로토콜.

PF_PACKET

Low level socket을 위한 인터페이스.

PF_IPX

IPX 노벨 프로토콜.

주소 체계(Address Family)는 대표적으로 아래와 같은 종류가 있다.

AF_INET

IPv4인터넷 프로토콜.

AF_INET6

IPv6인터넷 프로토콜.

AF_LOCAL

LOCAL 통신을 위한 UNIX 프로토콜.

소켓을 만들 때는 소켓이 사용될 환경을 고려해 프로토콜을 설정해 주어야한다. 다시 말해 프로토콜 패밀리는 소켓을 생성할 때 이 소켓이 어떤 프로토콜을 사용해 통신을 할지 정해준다. 참고로 소켓은 네트워크 통신을 할때만 사용되는 것이 아니다. 유닉스 계열의 시스템에서 시스템 내부의 프로세스들끼리 통신을 하기 위해서도 사용된다. 자주 사용되는 PF_INET는 프로토콜 패밀리중 하나이다. 프로토콜 체계를 나타내는 PF_INET와 주소체계를 나타내는 AF_INET 는 같은 상수 값을 가지고 있다. 그렇다고 해서 주소정보를 설정하는 부분에 PF_INET를 사용하고 프로토콜 패밀리 정보를 설정하는 부분에 AF_INET를 넣는 것은 좋지않다.

결과적으로,

  • 프로토콜 체계를 설정하는 부분은 PF로 시작하는 상수를 사용하고,
  • 주소 체계를 설정하는 부분은 AF로 시작하는 상수를 사용하는 것이 좋다.

실제 코딩 부분에서 socket()에 프로토콜 패밀리에 AF_INET를 넣어도 되지만 PF_INET를 넣는게 바람직하고 sockaddr_in 구조체에 주소 체계를 넣을 때에도 PF_INET 를 넣어도 되지만 AF_INET를 넣는게 바람직하다.

See also

Favorite site