SOCKET(2)

명칭
socket - 통신의 엔드 포인트의 작성

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/socket.h> int socket(int domain, int type, int protocol)

해설
socket() (은)는, 통신의 엔드 포인트를 작성해, 기술자를 되돌립니다.

domain 파라미터에서는, 통신을 행하는 통신 도메인을 지정합니다. 이것에 의해, 사용하는 프로토콜 패밀리가 선택됩니다. 이 프로토콜 패밀리는, 인클루드 파일 <sys/socket.h> 그리고 정의되고 있습니다. 현재 해석되는 포맷은 이하대로입니다.

    PF_LOCAL        PF_UNIX 로 불리고 있던, 호스트내 프로토콜
    PF_UNIX         호스트내 프로토콜, 사용은 장려되지 않는다.
                    PF_LOCAL 를 사용
    PF_INET         IPv4 프로토콜
    PF_IMPLINK      ARPAnet IMP 주소
    PF_PUP          BSP 와 같은 PUP 프로토콜
    PF_CHAOS        MIT CHAOS 프로토콜
    PF_NS           XNS (Xerox Network Systems) 프로토콜
    PF_ISO          ISO 프로토콜
    PF_OSI          개방형 시스템간 상호 접속 프로토콜
                    (Open System Interconnection)
    PF_ECMA         유럽 전자계산기 공업회
                    (European Computer Manufacturers)
    PF_DATAKIT      데이터 킷 (Datakit) 프로토콜
    PF_CCITT        X. 25 를 닮은 ITU-T 프로토콜
    PF_SNA          IBM SNA
    PF_DECnet       DECnet
    PF_DLI          DEC Direct / DLI (Data Link Interface) 프로토콜
    PF_LAT          LAT 프로토콜
    PF_HYLINK       NSC 하이퍼 채널
    PF_APPLETALK    AppleTalk 프로토콜
    PF_ROUTE        내부 routing protocol
    PF_LINK         링크층 인터페이스
    PF_XTP          XTP 프로토콜 (Xpress Transfer Protocol)
    PF_COIP         connection-oriented IP, 별명 ST II
    PF_CNT          Computer Network Technology 사의 프로토콜
    PF_SIP          SIP 프로토콜 (Simple Internet Protocol)
    PF_IPX          Novell 사 IPX (Intenet Packet eXchange) 프로토콜
    PF_RTIP         RTIP 패킷의 식별로 사용
    PF_PIP          PIP 패킷의 식별로 사용
    PF_ISDN         통합 디지털 통신 서비스망 (ISDN)
    PF_KEY          내부열쇠 관리 기능
    PF_INET6        IPv6 프로토콜
    PF_NATM         ATM 에 네이티브 액세스
    PF_ATM          ATM
    PF_NETGRAPH     Netgraph 소켓

소켓에는, 통신의 종류를 지정한다 타입 (이)가 있습니다. 현재, 정의되고 있는 타입은 이하대로입니다.

    SOCK_STREAM     스트림형 소켓
    SOCK_DGRAM      데이터 그램형 소켓
    SOCK_RAW        생 프로토콜 인터페이스
    SOCK_RDM        전달을 신뢰할 수 있는 패킷
    SOCK_SEQPACKET  순서 첨부 패킷 스트림

SOCK_STREAM 타입은, 연속한, 신뢰성이 있는, 쌍방향 접속 베이스의 바이트 스트림을 제공합니다. 대역외 데이터 전송 메카니즘이 서포트되는 일도 있습니다. SOCK_DGRAM 소켓에서는, 데이터 그램 (connectionless로 신뢰성이 없는, 최대장이 고정의 (일반적으로는 작다) 메세지)가 서포트됩니다. SOCK_SEQPACKET 소켓은, 연속한, 신뢰성이 있는, 쌍방향 접속 베이스의 최대장이 고정의 데이터 그램의 전송을 제공합니다. 각 읽기 시스템 콜로 패킷 전체를 읽어낼 필요가 있을지도 모릅니다. 이 기능은 프로토콜 고유의 것으로, 현재로서는 PF_NS 그리고 밖에 실장되고 있지 않습니다. SOCK_RAW 소켓에서는, 내부 네트워크 프로토콜과 인터페이스에 액세스 할 수 있습니다. 슈퍼 유저 밖에 사용할 수 없다 SOCK_RAW 타입, 및 계획되고 있지만 아직 실장되어 있지 않다 SOCK_RDM 에 대해서는, 여기에서는 설명하지 않습니다.

protocol 그럼, 소켓으로 사용하는 특정 프로토콜을 지정합니다. 통상의 경우는, 1 개의 프로토콜만이 존재해, 지정한 프로토콜 패밀리의 특정 소켓 타입을 서포트합니다. 그러나, 복수의 프로토콜이 존재하는 일도 가능합니다. 이 경우는, 특정 프로토콜을 이 방법으로 지정할 필요가 있습니다. 사용하는 프로토콜 번호는, 통신을 실시한다 “통신 도메인” 에 고유합니다. protocols(5) (을)를 참조해 주세요.

타입 SOCK_STREAM 의 소켓은, 파이프에 유사한 전이중 바이트 스트림입니다. 스트림 소켓에서는, 접속이 끝난 상태 (으)로 하고 나서 데이터를 송수신 할 필요가 있습니다. 다른 소켓에의 접속은, connect(2) (을)를 호출해 작성할 수 있습니다. 접속되면(자), read(2) (와)과 write(2) (을)를 호출하는지, send(2) (와)과 recv(2) 의 변종을 호출해 데이터를 전송 할 수 있습니다. (인터넷 패밀리 등, 일부의 프로토콜 패밀리에서는, “암묵 접속” 그렇다고 하는 관념이 서포트되고 있습니다. 이 접속에서는, sendto(2) (을)를 호출해, 접속 오퍼레이션에 실어 데이터를 송신할 수 있습니다. ) 세션이 종료하면(자), close(2) (을)를 실행해도 상관하지 않습니다. 대역외 데이터는, send(2) 그리고 설명되고 있도록(듯이) 송신해, recv(2) 그리고 설명되고 있도록(듯이) 수신할 수 있습니다.

SOCK_STREAM 의 실장에 사용하는 통신 프로토콜에서는, 데이터의 상실이나 중복이 없는 것이 프로텍션됩니다. 피어 프로토콜에 버퍼 공간이 있는 데이터의 일부를 합리적인 시간내에 문제 없고 전송 할 수 없는 경우는, 접속이 파손했다고 보여 호출이 에러가 되어, -1 하지만 되돌려져 글로벌 변수 errno 에 ETIMEDOUT 하지만 설정됩니다. 그 외의 동작이 없는 경우, 프로토콜은 약 1 분 마다 전송을 강제해, 소켓의 “접속” (을)를 임의에 유지합니다. 일정기간 (예를 들면 5 분간) 아이돌 접속으로 응답이 없는 경우는 에러가 됩니다. 파손한 스트림로 프로세스가 송신하면(자), SIGPIPE 시그널이 발생합니다. 이 경우, 시그널을 처리하지 않는 프로세스는 종료합니다.

SOCK_SEQPACKET 소켓은, SOCK_STREAM 소켓과 거의 같은 시스템 콜입니다. read(2) (을)를 호출해도, 요구된 양의 데이터 밖에 되돌려지고 두, 수신 패킷의 나머지의 부분은 방폐되는 점만이 다릅니다.

SOCK_DGRAM 소켓과 SOCK_RAW 소켓에서는, send(2) 의 호출로 지정된 통신 상대에게 데이터 그램을 송신할 수 있습니다. 일반적으로 데이터 그램은, 다음의 데이터 그램의 주소를 되돌린다 recvfrom(2) 그리고 수신됩니다.

fcntl(2) (을)를 호출하면(자), 대역외 데이터를 수신했을 경우의 SIGURG 시그널을 수신하는 프로세스 그룹을 지정할 수 있습니다. 비블로킹 입출력, 및 입출력 이벤트의 비동기 통지도, SIGIO 그리고 유효하게 할 수 있습니다.

소켓의 오퍼레이션은, 소켓 레벨의 옵션 그리고 제어됩니다. 이 옵션은, 파일 <sys/socket.h> 에 정의되고 있습니다. setsockopt(2) (은)는 옵션의 설정에, getsockopt(2) (은)는 옵션의 입수에 사용합니다.

반환값
에러가 발생하면(자) -1 가 되돌려집니다. 에러가 발생하지 않았던 경우는, 소켓을 참조하는 기술자가 되돌려집니다.

에러
이하와 같은 경우, socket() 의 호출은 에러가 됩니다.

[EPROTONOSUPPORT]
    프로토콜 타입이나 지정된 프로토콜이 도메인으로 서포트되고 있지 않습니다.

[EMFILE]
    프로세스마다의 기술자 테이블이 만배입니다.

[ENFILE]
    시스템 파일 테이블이 만배입니다.

[EACCES]
    지정된 타입이나 프로토콜의 소켓을 작성하는 권한이 거부되었습니다.

[ENOBUFS]
    버퍼 공간이 부족합니다. 충분한 리소스가 해방될 때까지 소켓을 작성할 수 없습니다.

관련 항목
accept(2), bind(2), connect(2), getpeername(2), getsockname(2), getsockopt(2), ioctl(2), listen(2), read(2), recv(2), select(2), send(2), shutdown(2), socketpair(2), write(2), getprotoent(3), netgraph(4), protocols(5) An Introductory 4.3 BSD Interprocess Communication Tutorial, PS1, 7. BSD Interprocess Communication Tutorial, PS1, 8.

역사
socket() 함수 호출은 4.2BSD 그리고 등장했습니다.