반응형
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 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
recv(2) - 데이터를 수신하는 함수 (0) | 2019.09.29 |
---|---|
setsockopt(2) - socket의 속성을 설정하는 함수 (0) | 2019.09.29 |
getsockname(2) - who am I? (나는 누구일까?) (0) | 2019.09.29 |
getpeername(2) - who are you? (너는 누구니?) (0) | 2019.09.29 |
shutdown(2) - 읽기 / 쓰기 금지 설정 (0) | 2019.09.29 |