Tuesday, June 24, 2008

Socket, options

소켓 사용시 여러 옵션을 줄 수 있는데, 아래 함수를 통해 set, get이 가능하다.

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

설정할 수 있는 옵션은 영역이 매우 다양한데(이를 테면, TCP에서의 옵션이라던가, IP레이어에서의 옵션이라던가 등...), 어느 영역에서의 옵션을 설정할 것인지를 두번째 인자인 level에서 선택할 수 있다. 몇개의 옵션들은 아래와 같다.
  • SOL_SOCKET
    • SO_BROADCAST
    • SO_REUSEADDR
      • TCP의 TIME_WAIT상태의 소켓을 다시 재사용할 수 있게 해주는 옵션으로 서버쪽에서 active close해서 TIME_WAIT상태로 빠지면 이 시간동안 listen이 실패하므로, 바로 listen할 수 있도록 TIME_WAIT상태에서소 소켓을 사용할 수 있도록 하기 위해 사용한다.
    • SO_LINGER
      • struct linger { int l_onoff; int l_linger; } 를 사용한다.
      • 데이터를 전송 후 끊기 위해 기다리는 시간을 l_linger에 지정할수 있는데, 0인경우 버퍼를 없에버리고 바로 close하며 client 쪽에도 RST를 보내서 TIME_WAIT되지 않고 바로 끊도록 한다. (aborty shutdown, aborty close. 0이 아닌 경우라면 graceful close/shutdown)
    • SO_KEEPALIVE
      • 일정시간마다 연결상태 확인
    • SO_OOBINLINE
    • SO_RCVBUF
      • 수신 버퍼크기 조정(실제로는 지정한 값의 두배가 잡힘). 자동으로 조정되는 경우에는 설정할 수 없는 경우도 있음
    • SO_SNDBUF
    • SO_RCVTIMEO
      • blocking 함수를 사용하는 경우(recv, ...) block에서 깨어날 시간을 지정할 수 있음. timeval로 지정하면 됨. timeout으로 빠져나오면 -1이 리턴되고, errno가 EAGAIN이 됨 (아래 SNDTIMEO도 마찬가지)
    • SO_SNDTIMEO
    • SO_RCVLOWAT
      • watermark인데 I/O를 발생할 최소단위의 크기를 지정한다. default로 1이다. (버전에 따라 지원정도가 다르다)
    • SO_SNDLOWAT
    • SO_TYPE
    • SO_ERROR
  • IPPROTO_IP
    • IP_TTL
    • IP_MULTICAST_TTL
    • IP_ADD_MEMBERSHIP
    • IP_DROP_MEMBERSHIP
    • IP_MULTICAST_LOOP
    • IP_MULTICAST_IF
  • IPPROTO_TCP
    • TCP_NODELAY
      • 1이면 Nagle Algorithm을 사용안함
    • TCP_MAXSEG
      • MSS크기 조절함(잘못 조절하면 ,... ㅡ.ㅡ;)

No comments:

Post a Comment