C/C++

[Socket] Option

알 수 없는 사용자 2008. 7. 8. 23:26
- Option 설정 함수
#include <sys/types.h>
#include <sys/socket.h>

// 소켓에 옵션을 설정하는 함수
int setsockopt(int sockfd, int level, int optname, const void *optval, int optlen);

// 소켓에 설정된 옵션 값을 얻어오는 함수
int getsockopt(int sockfd, int level, int optname, const void *optval, int *optlen);

반환값
반환 값은 성공시 0, 실패시 -1 리턴
리턴 값이 -1일 때 실패했다는 것을 알 수 있지만, 어떠한 이유로 실패했는지 상세하게 알기는 어렵다.
이때 errno변수를 참조하면 어떤 오류가 발생했는지 알 수 있다. (가장 최근의 오류 값만 저장한다.)
EBADF : sockfd 인자가 유효하지 않다.
ENOTSOCK : sockfd 인자가 소켓 파일 지시자가 아니다.
ENOPROTOOPT : optname이 주어진 레벨에 맞지 않다.

함수 인자
int sockfd : 소켓 옵션을 적용할 수켓 파일 지시자(Descriptor)다. 소켓 파일 지시자는 socket 함수로 생성된 소켓 객체라고 생각하면 된다.

int level : 옵션의 레벨을 결정한다. 좀더 자세히 얘기하면 소켓을 제어할 프로토콜 레벨을 결정하는 것으로써, SOL_SOCKET, IPPROTO_IP, IPPROTO_TCP를 지정할 수 있는데, 여기에서 결정되는 레벨에 따라서 optname(옵션 종류)가 달라지게 된다. 일반적으로 SOL_SOCKET이 사용되며, 앞으로 설명할 내용도 SOL_SOCKET의 옵션만을 다룬다는 점을 기억하자.

int optname :

void *optval :
옵션 값을 다루기 위해 사용하는 버퍼 주소다. setsockopt함수를 사용할 때는 새로 설정할 옵션 값이 저장되어 있는 버퍼의 주소이며, getsockopt함수를 사용할 때에는 기존에 설정된 옵션 값을 저장할 버퍼 주소다.

optlen : optval이 가리키는 버퍼의 크기


- 송/수신 타임아웃 설정

SO_SNDTIMEO : 송신 타임아웃 설정
SO_RCVTIMEO : 수신 타임아웃 설정

소켓을 생성할 때는 기본적으로 블로킹 소켓으로 생성된다.
시간 단위는 밀리(1/1000)초로 정수형을 사용한다.

#define MSEC 1000
int time = 10 * MSEC;
int optlen = sizeof(time);
setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, &time, optlen);
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &time, optlen);