개발환경
작성날짜 : 2011-01-20 |
참고한 홈페이지 & 블로그
소켓 통신 send/recive
http://cafe.naver.com/gnex.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=5901
http://cafe.naver.com/buildgame.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=46
setsockopt 함수, getsockopt 함수
http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/setsockopt
http://www.codesos.com/book/network/getsockopt.html
http://www.codesos.com/book/network/setsockopt.html
Nagle 알고리즘
http://blog.naver.com/dreamfox?Redirect=Log&logNo=30041946114
http://depiness.egloos.com/772710
http://blog.daum.net/_blog/BlogTypeView.do?
blogid=02X22&articleno=10121321#ajax_history_home
참고 서적
윤성우저 TCP/IP 열혈강의.
소켓 옵션이란?
네트워크 환경은 매우 다양하며, 예측하기 힘든 경우도 많이 발생한다. 때문에 네트워크프로그램의 종류에 따라서 소켓의 세부사항을 조절해야 하는 경우가 발생한다. 이러한 소켓옵션 설정을 위해서 소켓은 getsockopt()와 setsockopt()두개의 함수를 제공한다. 이름에서 알 수 있듯이 getsockopt는 현재의 소켓옵션값을 가져오기 위해서, setsockopt는 소켓옵션값을 변경하기 위해서 사용한다.
소켓 옵션
소켓 옵션에는 여러 가지가 있는데 그 중 간략하게 몇 개만 보여드리고 나머지는 홈페이지 링크를 이용하여 주세요.
IPPROTO_IP
IPPROTO_IPV6
IPPROTO_RM
IPPROTO_TCP
IPPROTO_UDP
NSPROTO_IPX
SOL_APPLETALK
SOL_IRLMP
SOL_SOCKET
Protocol Level | Option Name | Data Type | get | set |
SOL_SOCKET | SO_SNDBUF SO_RCVBUF SO_REUSEADDR SO_KEEPALIVE SO_BROADCAST SO_DONTROUTE SO_OOBINLINE SO_ERROR SO_TYPE | Int Int BOOL BOOL BOOL BOOL BOOL Int Int | ● ● ● ● ● ● ● ● ● | ● ● ● ● ● ● ●
|
IPPROTO_IP | IP_TOS IP_TTL IP_MULTICAST_TTL IP_MULTICAST_LOOP IP_MULTICAST_IF IP_HDRINCL IP_ADD_MEMBERSHIP
|
Int Int BOOL IN_ADDR{} BOOL Struct ip_mreq{} Struct ip_mreq{} | ● ● ● ● ● ● | ● ● ● ● ● ● ●
|
IPPROTO_TCP | TCP_KEEPALIVE TCP_NODELAY TCP_MAXSEG | BOOL BOOL
| ● ● ● | ● ● ● |
Setsockopt 함수
- 소켓 옵션을 설정하는 함수.
- Setsockopt 함수는 지정된 소켓의 옵션을 특정한 형태(type), 상태(state)로 결합하기 위해서 지정한 소켓 옵션 값을 셋팅 하는 함수.
Int setsockopt(SOCKET sock, int level, int optname, const char *optval,
int optlen);
sock : 옵션을 설정할 소켓.
level : 소켓 옵션 레벨이 정의 되며, SOL_SOCKET과 IPPROTO_TCP 중 하나가 될 수 있음.
optname : 설정을 위한 소켓옵션의 값.
optval : 설정 값을 저장하기 위한 버퍼의 포인터.
optlen : optval 매개변수 버퍼의 크기.
두 번째 인수 level은 소켓 옵션 레벨이 정의 되며, 소켓 연산에 영향을 미칩니다.(예를 들어 발송된 데이터를 일반 데이터 스트림으로 수신 했을 때나, 소켓으로 브로드캐스트 메시지를 전송할 때 영향을 미치게 됩니다.)
소켓 옵션을 변경해서 소켓이 동작하는 방법을 변경해야할 필요가 있을 때 이용하게 됩니다. 주로 많이 쓰이는 것은 소켓의 동작모드(블로킹/넌블로킹)를 바꾸는 것과 종료시 graceful하게 종료할 것인가를 정하는 것, 소켓의 송수신 버퍼 사이즈를 정해주는 것과 nagal 알고리즘을 켜고 끄는 것을 정해주는 것 정도입니다. 이 옵션들을 잘못 변경하게 되면 소켓 성능에 큰 영향을 미치므로, 소켓을 이용할 때 갖게 될 상황에 따라 이용하시면 됩니다. 이 함수를 사용해서 옵션을 변경해서 생기는 불이익은 오로지 프로그래머의 몫임을 잊지 마시기 바랍니다. 그만큼 적용할 때 고민해 보고 사용해야 합니다. 다음은 이 함수를 사용한 몇 개의 예입니다. 서버의 리슨 소켓에 적용되는 것이지요.
옵션값 | 데이터형태 | 의미 |
SO_BROADCAST | BOOL | 소켓으로 브로드캐스트 메시지를 전송 할 수 있도록 함. |
SO_DEBUG | BOOL | 디버깅 정보를 레코딩 함. |
SO_DONTLINGER | BOOL | 소켓을 종료 할 때 보내지지 않은 데이터를 보내기 위해서 블럭킹 상태가 되지 않도록 함. |
SO_DONTROUTE | BOOL | 라우팅 하지 않고, 직접 인터페이스로 보냄. |
SO_GROUP_PRIOTIRY | int | 소켓 그룹의 일부분인 소켓을 만들기 위해 관련된 우선사항을 명시. |
SO_KEEPALIVE | BOOL | Keeppalives를 전송. |
SO_LINGER | Struct LINGER | 아직 전송되지 않은 데이터가 있을 경우 소켓을 종료 할 때 대기함. |
SO_OOBINLINE | BOOL | 일반 데이터 스트림으로 OOB데이터를 수신. |
SO_RCVBUF | int | 데이터를 수신하기 위한 총 버퍼공간을 명시. |
SO_REUSEADDR | BOOL | 이미 사용되고 있는 어드레스를 바인드 할수 있도록 함. |
SO_SNDBUF | int | 데이터를 전송하기 위한 총 버퍼공간을 명시. |
Getsockopt 함수
- 설정된 소켓 옵션의 값을 얻어내는 함수.
- Getsockopt 함수는 특정한 형태(type), 특정한 상태(state)로 연관 되어있는 소켓 옵션에 대해 설정되어 있는 값을 optval 매개변수에 저장해서 얻어내는 함수입니다.
int getsockopt(SOCKET sock, int level, int optname, char *optval, int *optlen);
sock : 값을 얻어낼 소켓.
level : 소켓 옵션 레벨이 정의 되며, SOL_SOCKET과 IPPROTO_TCP 중 하나가 될 수 있음.
optname : 이 함수에 의해서 반환될 값에 대한 소켓 옵션을 명시.
optval : 요청된 옵션에 대한 반환되는 옵션값이 저장 될 버퍼에 대한 포인터.
optlen : optval 매개변수 버퍼의 크기.
Setsockopt와 같은 형태를 가지며, 인자들은 똑같지요. 값을 넣는 것이 아니라 받아오는 것이 다를 뿐입니다.
옵션값 | 데이터 형 태 | 의미 |
SO_ACCEPTCONN | BOOL | TRUE일 경우 소켓이 리슨 하고 있습니다. |
SO_BROADCAST | BOOL | TRUE일 경우 소켓은 브로드캐스트 메시지를 전송함. |
SO_DEBUG | BOOL | TRUE일 경우 디버깅이 가능. |
SO_DONTLINGER | BOOL | TRUE일 경우 SO_LINGER옵션은 무시. |
SO_DONTROUTE | BOOL | TRUE일 경우 라우팅 무시. |
SO_ERROR | int | 에러상태를 반환하고, 클리어 됨. |
SO_GROUP_ID | GROUP | 소켓이 속해있는 그룹 식별자를 의미. |
SO_GROUP_PRIORITY | int | 소켓에 관련된 우선사항은 소켓 그룹의 부분. |
SO_KEEPALIVE | BOOL | TRUE일 경우 keepalive가 전송. |
SO_LINGER | Struct LINGER | 현재의 linger옵션을 반환. |
SO_OOBINLINE | BOOL | TRUE 일 경우 아웃오브밴드 데이터가 정상적인 데이터 스트림으로 수신. |
SO_RCVBUF | int | 수신 버퍼크기를 의미. |
Nagle 알고리즘
Nagle 알고리즘에 대해서 간단히 설명하자면, Nagle 알고리즘은 “가능하면 조금씩 여러 번 보내지 말고 한번에 많이 보내라” 라는 원칙을 기반으로 만들어진 알고리즘입니다.
Nagle 알고리즘이 적용되면, 운영체제는 패킷 ACK가 오기를 기다렸다가 도착하면, 그 동안 쌓여있던 데이터를 한꺼번에 보내게 됩니다. 이러한 방식을 사용하게 되면, 대역폭이 낮은 WAN에서 빈번한 전송을 줄이게 됨으로 효과적인 대역폭 활용이 가능해 집니다. 그러나 빈번한 응답이 중요한 서비스의 경우(예를 들어 실시간 반응이 중요한 온라인 게임 같은 경우 Nagle알고리즘을 제거 하는게 좋을 겁니다.)에는 Nagle을 사용하지 않는 편이 더 좋을 수 있습니다. (Non – Nagle : 상대방에 응답을 기다리지 않고 데이터를 곧바로 송신)
'Programming > Win32 API' 카테고리의 다른 글
[Win32 API] Timer (0) | 2015.05.11 |
---|---|
[Win32 API] SetRect 함수 (0) | 2015.05.11 |
[Win32 API] BitBit 함수 (0) | 2015.05.11 |
[Win32 API] 소켓 send, recv 함수 (0) | 2015.05.11 |
[Win32 API] 똑딱이 (0) | 2015.05.11 |