GETSOCKOPT(2)

명칭
getsockopt, setsockopt - 소켓의 옵션의 취득과 설정

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/socket.h> int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)

해설
getsockopt() (와)과 setsockopt() (은)는, 소켓에 대응한다 옵션 (을)를 조작합니다. 옵션은 복수의 프로토콜 레벨에 존재할 가능성이 있습니다. 이것들은 반드시 최상정도의 “소켓” 레벨에 존재합니다.

소켓 옵션을 조작할 때는, 옵션이 상주하는 레벨 및 옵션의 이름을 지정할 필요가 있습니다. 소켓 레벨로 옵션을 조작하려면 level (을)를 SOL_SOCKET (으)로서 지정합니다. 다른 레벨로 옵션을 조작하려면 , 옵션을 제어하고 있는 적절한 프로토콜의 프로토콜 번호를 지정합니다. 예를 들면, 옵션이 TCP 프로토콜에 의해 해석되는 것을 지시하려면 , level (을)를 TCP 의 프로토콜 번호로 설정할 필요가 있습니다. getprotoent(3) (을)를 참조해 주세요.

파라미터 optval (와)과 optlen (은)는, setsockopt() 하지만 옵션치에 액세스 하기 위해서 사용됩니다. getsockopt() 의 경우, 이것들은 요구된 옵션의 값이 돌려주어진다 버퍼를 식별합니다. getsockopt() 의 경우, optlen (은)는 「값 - 결과」파라미터이며, 초기에는 optval (이)가 가리키는 버퍼의 사이즈가 들어가 있어 귀가시에 수정되어 돌려주어진 값의 실제의 사이즈를 나타내게 됩니다. 옵션치를 지정하지 않는지, 또는 옵션치가 돌려주어지지 않은 경우, optval 에 NULL 를 지정해도 괜찮습니다.

optname 및 지정의 옵션은, 해석되지 않고 , 해석용의 해당 프로토콜 모듈에게 건네집니다. 인클루드 파일 <sys/socket.h> 에는 후술 하는 소켓 레벨 옵션용의 정의가 들어가 있습니다. 다른 프로토콜 레벨의 옵션은 형식과 명칭이 다양합니다. 메뉴얼의 섹션 4 의 해당하는 엔트리를 참조해 주세요.

대부분의 소켓 레벨의 옵션은 optval 용으로 int 파라미터를 사용합니다. setsockopt() 의 경우, 불 연산을 유효하게 하기 위해서는 파라미터는 0 이 아닐 필요가 있어, 옵션을 무효로 하는 경우는 0 일 필요가 있습니다. SO_LINGER (은)는, <sys/socket.h> 그리고 정의되었다 struct linger 파라미터를 사용합니다. 이것은, 목적 상태의 옵션과 링가-인터벌 (후술)을 지정합니다. SO_SNDTIMEO (와)과 SO_RCVTIMEO (은)는, <sys/time.h> 그리고 정의되었다 struct timeval 파라미터를 사용합니다.

이후의 옵션이 소켓 레벨로 인식됩니다. 별기했을 경우를 제외해, 각 옵션이 getsockopt() 그리고 조사할 수 있어 setsockopt() 그리고 설정됩니다.
SO_DEBUG | 디버그 정보의 기록을 유효하게 합니다
SO_REUSEADDR | 로컬 주소의 재사용을 유효하게 합니다
SO_REUSEPORT | 중복 한 주소와 포트의 바인드를 유효하게 합니다
SO_KEEPALIVE | 접속을 보관 유지하는 것을 유효하게 합니다
SO_DONTROUTE | 발신 메세지에 대해 경로 설정 우회도로를 유효하게 합니다
SO_LINGER | 데이터가 존재하는 경우는 클로우즈로 지연 합니다
SO_BROADCAST | 브로드캐스트 메세지를 송신하는 퍼미션을 유효하게 합니다
SO_OOBINLINE | 밴드내에서의 밴드외 데이터의 수신을 유효하게 합니다
SO_SNDBUF | 출력용의 버퍼 사이즈를 설정합니다
SO_RCVBUF | 입력용의 버퍼 사이즈를 설정합니다
SO_SNDLOWAT | 출력용의 최소 카운트를 설정합니다
SO_RCVLOWAT | 입력용의 최소 카운트를 설정합니다
SO_SNDTIMEO | 출력에 대한 타임 아웃치를 설정합니다
SO_RCVTIMEO | 입력에 대한 타임 아웃치를 설정합니다
SO_ACCEPTFILTER | 기다리고 소켓에서의 받아 용필터를 설정합니다
SO_TYPE | 소켓의 타입을 취득합니다 (취득만)
SO_ERROR | 소켓의 에러를 취득해 클리어 합니다 (취득만)

SO_DEBUG (은)는 하층의 프로토콜 모듈내에서 디버그를 유효하게 합니다. SO_REUSEADDR (은)는, bind(2) 호출로 지정된 주소를 검증하는데 사용하는 규칙으로, 로컬 주소의 재이용이 가능한 것을 나타냅니다. SO_REUSEPORT (은)는, 포트를 바인드 하기 전의 복수의 프로세스가 모두 SO_REUSEPORT (을)를 설정해 있는 경우에, 복수의 프로세스에 의한 완전하게 중복 한 바인드가 가능하게 되도록(듯이) 합니다. 이 옵션은, 프로그램의 복수의 인스턴스 각각이, 바인드 된 포트를 행선지로 하는 UDP/IP 멀티 캐스트 또는 브로드캐스트의 데이터 그램을 수신할 수 있도록(듯이) 합니다. SO_KEEPALIVE (은)는 접속된 소켓상에서 메세지의 주기적인 송신을 유효하게 합니다. 접속된 뿐이 이러한 메세지에 응답할 수 없는 경우는 접속이 파괴되고 있다고 생각되어 소켓을 사용하고 있는 프로세스는 데이터를 송신하려고 할 때 SIGPIPE 시그널에 의해 통지를 받습니다. SO_DONTROUTE (은)는 발신 메세지가 표준의 경로 설정 기능을 우회도로 할 필요가 있는 것을 나타냅니다. 대신에, 메세지는, 행선지 주소의 네트워크 부분에 따라 해당하는 네트워크 인터페이스에 전송 됩니다.

SO_LINGER (은)는 송신되어 있지 않은 메세지가 소켓의 기다리는 행렬에 있어, 게다가 close(2) 하지만 실행될 때에 행해지는 처치를 제어합니다. 소켓이 데이터의 신뢰할 수 있는 전달을 확약해, 게다가 SO_LINGER 하지만 설정되어 있는 경우, 데이터를 송신할 수 있을 때까지 또는 정보를 전달할 수 없다 (링가-인터벌로 불리는 타임 아웃 시간은, SO_LINGER 하지만 요구될 때 setsockopt() 호출내에서 초단위로 지정됩니다)와 판정할 때까지, 시스템은 프로세스를 close(2) 위에서 블록 합니다. SO_LINGER 하지만 무효 상태로 close(2) 하지만 기동되면(자), 시스템은, 프로세스가 가능한 한 신속히 처리를 계속할 수 있는 방법으로 클로우즈 처리를 실시합니다.

옵션 SO_BROADCAST (은)는, 소켓상에서 브로드캐스트 데이터 그램을 송신하는 퍼미션을 요구합니다. 브로드캐스트는, 시스템의 초기 버젼에서는 특권 조작이었습니다. 밴드외의 데이터를 서포트하는 프로토콜로, SO_OOBINLINE 옵션은, 밴드외의 데이터가 수신된 차례로 통상의 데이터 입력 기다리는 행렬에 배치되는 것을 요구합니다. 그리고, 이것은 MSG_OOB 플래그없이 recv(2) 호출해 또는 read(2) 호출로 액세스 할 수 있습니다. 항상 이 옵션이 설정되어 있는 것과 같게 동작한다 프로토콜도 있습니다. SO_SNDBUF (와)과 SO_RCVBUF (은)는, 각각, 출력 및 입력용에 할당할 수 있는 통상의 버퍼 사이즈를 조정하는 옵션입니다. 버퍼의 사이즈는, 고볼륨 접속을 위해서(때문에) 증가할 수가 있고, 착신 데이터의 가능한 백 로그를 제한하기 위해서 감소시킬 수도 있습니다. 시스템은 이러한 값에 대해 1 개의 절대 최대치를 설정합니다. 이 최대치는 sysctl(3) MIB 변수 “kern.ipc.maxsockbuf” 에 의해 액세스 할 수 있습니다.

SO_SNDLOWAT (은)는 출력 조작에 최소 카운트를 설정하는 옵션입니다. 대부분의 출력 조작은, 송신용의 프로토콜에 데이터를 전달해, flow control를 위해서(때문에) 블록 하면서 호출에 의해 주어진 모든 데이터를 처리합니다. 논브록킹 출력 조작은, 블록 없음의 flow control에 따라 허용 되는 한계까지 데이터를 처리합니다만, flow control가 최저 기준치 또는 요구 전체의 언젠가 작은 (분)편을 처리하는 것을 허용 하지 않는다 경우는 데이터를 처리하지 않습니다. 소켓에의 기록 능력을 시험한다 select(2) 조작이 진으로 돌아가는 것은, 최저 기준치를 처리할 수 있는 경우만입니다. SO_SNDLOWAT 의 기본값은 네트워크 효율성을 위해서(때문에) 적절한 사이즈 (많은 경우는 1024)로 설정됩니다. SO_RCVLOWAT (은)는 입력 조작의 최소 카운트를 설정하는 옵션입니다. 일반적으로, 수신 호출은, 얼마인가의 (0 이 아니다) 데이터가 수신될 때까지 블록 하고 나서, 이용할 수 있는 양 또는 요구된 양의 언젠가 적은 (분)편과 함께 돌아옵니다. SO_RCVLOWAT 의 기본값은 1 입니다. SO_RCVLOWAT 에 좀 더 큰 값이 설정되어 있는 경우, 수신 호출의 블록은 통상, 최저 기준치 또는 요구된 양의 언젠가 작은 것이 수신될 때까지 대기합니다. 수신 호출은, 에러가 발생하거나 시그널이 잡히거나 또는 수신 기다리는 행렬내의 다음의 데이터의 타입이 돌려주어진 것과 다른 경우는, 최저 기준치보다 작은 값으로도 돌아오는 일이 있습니다.

SO_SNDTIMEO (은)는 출력 조작에 대해 타임 아웃치를 설정하는 옵션입니다. 이것은, 출력 조작 완료의 대기를 제한하기 위해서 사용되는 초수, 마이크로 세컨드수를 struct timeval 파라미터로 지정합니다. 송신 조작이 지정된 시간 이상 블록 되었을 경우, 부분적인 카운트로 돌아오는지, 또는 데이터가 송신되어 있지 않은 경우는 에러 EWOULDBLOCK 그리고 돌아옵니다. 현재의 실장에서는, 이 타이머는 추가의 각 데이터가 프로토콜에 전달될 때마다 재기동되어 이것은 사이즈가 출력용의 최저 기준치로부터 최고 기준치의 범위에 이르는 출력 부분에 적용되는 것을 의미합니다. SO_RCVTIMEO (은)는 입력 조작에 대해 타임 아웃치를 설정하는 옵션입니다. 이것은 입력 조작 완료의 대기를 제한하기 위해서 사용되는 초수, 마이크로 세컨드수를 struct timeval 파라미터로 지정합니다. 현재의 실장에서는, 이 타이머는 추가의 데이터가 프로토콜에 의해 수신될 때마다 재기동되므로, 제한은 실제로는 휴지 기간의 타이머가 됩니다. 추가의 데이터를 수신하는 일 없이 수신 조작이 이만큼의 시간에 대해 블록 되었을 경우, 짧은 카운트로 돌아오는지, 또는 데이터가 수신되어 있지 않은 경우는 에러 EWOULDBLOCK 그리고 돌아옵니다.

SO_ACCEPTFILTER (은)는, 소켓상에 accept_filter(9) (을)를 둡니다. 이것에 의해, 기다리고 하고 있는 스트림 소켓에 들어 오는 접속이 accept(2) 에게 건네지기 전에 필터 되게 됩니다. 만약을 위해 반복합니다. 필터를 소켓상에 인스톨 하기 전에, 소켓에 대해서 listen(2) 호출할 필요가 있습니다. 그렇게 하지 않으면 setsockopt() 호출이 실패합니다.

    struct  accept_filter_arg {
            char    af_name[16];
            char    af_arg[256-16];
    };

optval 하 struct accept_filter_arg (을)를 가리키지 않으면 안됩니다. 이 구조체가 accept_filter(9) (을)를 선택, 설정합니다. af_name (은)는, 어플리케이션이 기다리고 소켓상에 두고 싶다고 생각하고 있다 수취용 필터의 이름으로 묻지 않으면 안됩니다. af_arg (은)는 옵션의 파라미터로, af_name 그리고 지정된 수취용 필터에 건네줄 수가 있는 것입니다. 이것에 의해, 소켓에 놓여질 때에 새로운 설정 옵션을 제공합니다. NULL 를 optval 안으로 건네주면(자), 필터가 삭제됩니다.

마지막으로, SO_TYPE (와)과 SO_ERROR 하 getsockopt() 그리고만 사용되는 옵션입니다. SO_TYPE 그럼 SOCK_STREAM (와)과 같은 소켓의 타입이 돌아갑니다. 이것은 스타트 업시에 소켓을 계승하는 것 같은 서버에 편리합니다. SO_ERROR (은)는 소켓상에서 연기중의 에러를 돌려주어, 에러 상태를 클리어 합니다. 이것은 접속된 데이터 그램 소켓상의 비동기적 에러를 체크하거나 그 외의 비동기 에러를 체크하는데 사용할 수 있습니다.

반환값

에러
호출은 다음의 경우를 제외해 정상적입니다.

[EBADF]
    인수 s 하지만 유효한 기술자가 아닙니다.

[ENOTSOCK]
    인수 s 하지만 소켓은 아니고 파일입니다.

[ENOPROTOOPT]
    지시받은 레벨로 옵션은 존재하지 않습니다.

[EFAULT]
    optval 하지만 가리키는 주소가 프로세스 address 공간의 유효한 부분에 없습니다. getsockopt() 그럼, optlen 하지만 프로세스 address 공간의 유효한 부분이 아닌 경우도, 이 에러가 돌려주어질 가능성이 있습니다.

[EINVAL]
    기다리지 않은 소켓에 대해서 accept_filter(9) 의 인스톨을 시도했습니다.

관련 항목
ioctl(2), socket(2), getprotoent(3), sysctl(3), protocols(5), sysctl(8), accept_filter(9)

버그
소켓 옵션의 몇개인가는 시스템의 낮은 레벨로 처리될 필요가 있습니다.

역사
getsockopt() 시스템 콜은 4.2BSD 그리고 처음 등장했습니다.