socket(2)

#include <sys/types.h> 
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

socket( ) 시스템콜 함수는 다양한 형태의 socket 통신을 위한 socket descriptor(또는 file descriptor)를 생성하는 함수입니다. 

 

파라미터

domain
    - Protocol 계열(Protocol Family)을 설정합니다. 
    - Protocol Family는 <sys/socket.h>에 정의되어 있습니다.

- Protocol Family는 AF_*, PF_*의 상수로 선언되어 있으며, AF_*와 PF_*는 같은 값입니다.
- PF_*는 하위 호환성을 유지하기 <sys/types.h>에 정의되어 있으며, AF_*를 사용하기 바랍니다. 
  (PF_*를 사용하지 않는다면, #include<sys/types.h>는 필요없습니다.)

AF_UNIX, AF_LOCAL : machine 내부에서 사용하는 protocol로 File을 통해 통신합니다.
AF_INET : IPv4 기반의 internet protocol을 지원합니다.
AF_INET6 : IPv6 기반의 internet protocol을 지원합니다.
AF_IPX : Novell protocol을 지원합니다.
AF_NETLINK : Netlink를 지원합니다.
AF_X25 : ITU-T X.25 / ISO-8208 protocol을 지원합니다.
AF_AX25 : Amateur radio AX.25 protocol을 지원합니다.
AF_ATMPVC : raw ATM PVCs 접속을 지원합니다.
AF_APPLETALK : AppleTalk 접속을 지원합니다.
AF_PACKET : Low level packet interface를 지원합니다.
AF_ALG : kernel crypto API와 interface를 지원합니다.
type
    - 데이터 전송 방식을 설정합니다. 
    - domain에서 정의한 Protocol Family 마다 모두 아래의 type을 지원하는 것은 아닙니다. 

SOCK_STREAM : 데이터 전송 순서와 신뢰성을 보장하는 Connection base의 전송 방식.
                      수신쪽에서는 데이터를 보낸 횟수에 관계없이 보낸 크기만 의미를 가짐.
                      Out Of Band 데이터 전송이 가능함.
SOCK_DGRAM : 데이터 전송 순서 및 전송 신뢰성을 보장할 수 없는 Connection less 전송 방식.
                      순서 및 신뢰성 체크가 빠져서 성능이 빠름.
SOCK_SEQPACKET : 데이터 전송 순서와 신뢰성을 보장하는 Connection base의 전송 방식.
                      수신 시에는 보낸 데이터의 크기 만큼을 한번에 읽어야 함.
SOCK_RAW : raw network access를 제공함.
SOCK_RDM : 신뢰성있는 Datagram layer를 제공해주나 순서보장은 안됨
SOCK_PACKET : device drive(OSI 2 layer)와 raw data를 송수신할 때에 사용함.
protocol
    - domain과 type에 의하여 최종적인 protocol이 정의되기 때문에 사용되지 않고 항상 0으로 설정합니다.
    - 원래는 domain + type + protocol로 정의될 것으로 기대했으나, 
      지금까지는 domain + type에 의하여 통신 protocol의 결정됩니다.
통신 Protocol 별 설정값

 Protocol 종류    domain             type            protocol
 -------------------------------------------------------------
 TCP              AF_INET  (IPv4)    SOCK_STREAM     0
 TCP              AF_INET6 (IPv6)    SOCK_STREAM     0
 UDP              AF_INET  (IPv4)    SOCK_DGRAM      0
 UDP              AF_INET6 (IPv6)    SOCK_DGRAM      0
 X.25             AF_X25             SOCK_STREAM     0
 Local            AF_UNIX            SOCK_STREAM     0
 Local            AF_LOCAL           SOCK_STREAM     0

 

RETURN

-1이 아님
    - 정상적으로 생성된 socket 번호

-1
    - 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.
 EACCES : Socket 생성권한 없음.
 EAFNOSUPPORT : 지원하지 않는 address family.
 EINVAL : Unknown protocol, or protocol family not available.
 EINVAL : 잘못 설정된 type.
 EMFILE : process별 생성할 수 있는 최대 file descriptor 갯수  초과
 ENFILE : 시스템 전체 파일 open 갯수 초과
 ENOBUFS or ENOMEM : 메모리 등의 리소스 부족 오류
 EPROTONOSUPPORT : protocol 값을 잘못 설정함(domain에서 지원하지 않는 protocol)

 


활용 예제

 

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>

    ......

    int socket_no;

    /* TCP/IP용 socket을 생성합니다. */
    if((socket_no = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fprintf(stderr, "socket open error: %s\n", strerror(errno));
        return -1;
    }
    
    ......

 


see also : Socket 통신과 Socket 응용

 

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요