블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

05-13 09:09

Recent Post

Recent Comment

Recent Trackback

Archive

2015. 5. 11. 10:20 Programming/Win32 API

개발환경



작성날짜    : 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

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

IPPROTO_IPV6   

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

IPPROTO_RM     

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

IPPROTO_TCP    

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

IPPROTO_UDP    

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

NSPROTO_IPX    

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

SOL_APPLETALK 

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

SOL_IRLMP        

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx

SOL_SOCKET      

http://translate.google.co.kr/translate?hl=ko&langpair=en|ko&u=http://msdn.microsoft.com/en-us/library/ms740525(v%3Dvs.85).aspx


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


IP_DROP_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
posted by Kanais