반응형

getsockopt(2)

#include <sys/socket.h>

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

생성된 socket에 대해 설정된 속성값을 얻는 함수입니다.

 

 

파라미터

sockfd
    - socket(2), accept(2) 등으로 생성된 socket descriptor 
level
    - optname 값이 socket level인지 특정 protocol에 대한 설정인지를 지정하는 값

 SOL_SOCKET : optname이 socket level에서 설정하는 option명임을 지정함
 IPPROTO_IP : optname이 IP protocol level에서 설정하는 option명임을 지정함
 IPPROTO_TCP : optname이 TCP protocol level에서 설정하는 option명임을 지정함
optname
    - level의 종류에 따라 다른 설정이름을 갖습니다.

 SOL_SOCKET level의 상수
 SO_ACCEPTCONN : accept된 connection 여부 조회(get only) : 1이면 accept(2)된 connection.
 SO_BROADCAST : datagram socket에 boradcast flag값을 (set/get)
 SO_DOMAIN : socket에 설정된 domain값 (ex. AF_INET, AF_UNIX 등...)을 얻는다. (get only)
 SO_ERROR : socket error를 읽고 지움. (get only)
 SO_DONTROUTE : gateway를 통해서 전송을 금지하고 직접 연결된 host끼리만 전달하게 함. (set/get)
 SO_KEEPALIVE : cconnection-oriented socket에서 keep alive message를 전송할 수 있도록 함. (set/get)
 SO_LINGER : linger option 설정 (set/get)
     struct linger {
         int l_onoff;    /* linger active */
         int l_linger;   /* how many seconds to linger for */
     };
     l_onoff를 1로 설정하면, close(2), shutdown(2) 함수를 실행하면 미전송된 데이터를 정상적으로 전송하거나
     linger timeout이 도래되면 함수를 return함.  그렇지 않으면 바로 return되고 background로 작업하게 됨.

 SO_OOBINLINE : out of bound data를 직접 읽을 수 있게 set/get (주로 X.25에서 사용)
 SO_PROTOCOL : socket에 설정된 protocol을 읽음.
 SO_RCVBUF : socket에서 읽을 수 있는 최대 buffer의 크기를 set/get함
 SO_REUSEADDR : bind(2) 시에 local 주소를 재사용할 것인지 여부를 set/get함
 SO_SNDBUF : socket에서 write할 수 있는 최대 buffer의 크기를 set/get함
 SO_TYPE : 설정된 socket의 type(ex. SOCK_STREAM, SOCK_DGRAM0을 get함 
 optval
     - optname에 따른 설정할 값 또는 get할 buffer
optlen
    - optval의 크기

 

RETURN

0
    - 정상적으로 socket의 속성 값을 읽었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류내용은 errno에 설정됩니다.

 EBADF    : sockfd 유효한 descriptor가 아님.
 EFAULT   : optval가 이 프로세스의 유효한 메모리 번지가 아님.
 EINVAL   : optval이나 optlen이 유효하지 않음. 
 ENOPROTOOPT : level이 알려지지 않은 값.
 ENOTSOCK : sockfd가 file descriptor이지 socket descriptor가 아님.

 


활용 예제

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

int sockfd;
int flag;
socklen_t size;

...

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    fprintf(stderr, "socket 생성 error: %s\n", strerror(errno));
    return -1;
}

......

size = sizeof(flag);

if(getsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, &size) == -1) {    
    fprintf(stderr, "socket 생성 error: %s\n", strerror(errno));
    return -1;
}

if(flag == 1) {
    printf("socket %d는 주소 재사용이 설정된 socket입니다.\n", sockfd);
}

 


see also : Socket 통신과 Socket 응용

 

 

 

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,