|
프로토콜 레벨 |
옵션 이름 |
타 입 |
의 미 |
SOL_SOCKET |
SO_REUSEADDR |
BOOL |
이미 사용된 주소를 재사용 (bind) 하도록 한다. |
SO_BROADCAST |
BOOL |
소켓으로 브로드캐스트메시지를 전송할 수 있독록 함. (UDP일 때 쓰임) | |
SO_DEBUG |
BOOL |
디버깅 정보를 레코딩 함 | |
SO_DONTLINGER |
BOOL |
소켓을 종료 할 때 보내지지 않은 데이터를 보내기 위해서 블락킹 상태가 되지 않도록 함 | |
SO_DONTROUTE |
BOOL |
라우팅 하지 않고, 직접 인터페이스로 보냄 | |
SO_GROUP_PRIORITY |
int |
소켓 그룹의 일부분인 소켓을 만들기 위해 관련된 우선 사항을 명시함 | |
SO_KEEPALIVE |
BOOL |
Keeppalives를 전송하게 함 | |
SO_LINGER |
struct LINGER |
아직 전송되지 않은 데이터가 있을 경우 소켓을 종료 할 때 대기하게 함 | |
SO_OOBINLINE |
BOOL |
일반 데이터 스트림으로 OOB데이터를 수신 | |
SO_SNDBUF |
int |
데이터를 송신하기 위한 총 버퍼공간을 명시 | |
SO_RCVBUF |
int |
데이터를 수신하기 위한 총 버퍼공간을 명시 | |
IPPROTO_TCP |
TCP_NODELAY |
BOOL |
Nagle 알고리즘을 활성화여부를 설정 |
l getsockopt함수
- 소켓의 설정되어 있는 옵션값을 얻어오는 함수
- 성공 시 0, 실패 시 SOCKET_ERROR를 반환한다.
int getsockopt(SOCKET sock, int level, int optname, const char *optval, int *optlen);
sock: 값을 얻어낼 소켓
level: 어떤 레벨의 소켓정보를 얻어올 것인지를 명시한다. (보통 SOL_SOCKET과 IPPROTO_TCP중 하나)
optname: 얻고 싶은 옵션의 번호(이름)
optval: 설정하고 싶은 값을 저장한 버퍼의 포인터
optlen: optval버퍼의 크기
- getsocket에 쓰이는 옵션값
프로토콜 레벨 |
옵션 이름 |
타 입 |
의 미 |
SOL_SOCKET |
SO_REUSEADDR |
BOOL |
TRUE 일 경우 소켓은 사용된 주소를 재사용 (bind) 할 수 있는 상태 |
SO_ACCEPTCONN |
BOOL |
TRUE일 경우 소켓이 리슨 하고 있는 상태 | |
SO_BROADCAST |
BOOL |
TRUE일 경우 소켓은 브로드캐스트 메시지를 전송함 (UDP일 때 쓰임) | |
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_SNDBUF |
int |
데이터를 송신하기 위한 총 버퍼공간을 반환 | |
SO_RCVBUF |
int |
데이터를 수신하기 위한 총 버퍼공간을 반환 | |
SO_TYPE |
int |
소켓 타입을 반환 (예: SOCK_STREAM) | |
SO_CONNECT_TIME |
Int |
소켓이 연결된 이후에 경과된 시간을 반환 | |
IPPROTO_TCP |
TCP_NODELAY |
BOOL |
FALSE일경우Nagle 알고리즘이 활성중인 상태 |
l SO_REUSEADDR:
- 소켓을 이용한 서버프로그램에서 강제종료 같은 비정상종료가 발생하고 다시 연결하려 하면 bind에러가 발생하게 된다. 서버가 비정상 종료시 TIME-WAIT상태가 되어 일정시간 동안 다시 접속할 수가 없게 되는 것인데, SO_REUSEADDR의 설정값을 1(TRUE)로 바꾸면 대기없이 바로 PORT번호를 받을 수 있게 할 수 있다.
l TCP_NODELAY
- TCP소켓에서 Nagle 알고리즘 사용여부를 결정할 수 있다.
- Nagle알고리즘이란 데이터를 바로 보내지 않고 데이터를 모아놨다 패킷ACK가 수신되면 한꺼번에 보내는 알고리즘으로서 대역폭이 낮은 WAN에서 빈번한 전송을 줄이게 됨으로 효과적인 대역폭 활용이 가능하다.
- 하지만 빈번한 응답이 필요한 서비스의 경우 사용하지 않는 것이 더 좋을 수 있기 때문에 TCP_NODELAY의 설정값을 1(TRUE)을 줌으로서 Nagle알고리즘을 사용하지 않게 할 수 있다.
l setsockopt와 getsockopt를 이용한 간단한 예제
setgetsock.cpp |
#include <winsock2.h> #pragma comment(lib,"ws2_32") #include <windows.h> #include <iostream> using std::cout; using std::endl;
void ShowSocketBufSize(SOCKET sock); int snd_buf; // 송수신버퍼를 변경하기 위한 전역변수 int rcv_buf;
int main() { WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa);
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
ShowSocketBufSize(sock); // 변경전의 소켓의 송수신 버퍼크기를 출력한다.
snd_buf = 1024*3; // 변경하고 싶은 송수신버퍼의 크기를 대입 rcv_buf = 1024*3;
setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&snd_buf, sizeof(snd_buf)); // 해당 소켓의 송신버퍼크기를 snd_buf로 설정한다. setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&rcv_buf, sizeof(rcv_buf)); // 해당 소켓의 송신버퍼크기를 rcv_buf로 설정한다.
ShowSocketBufSize(sock); // 변경후의 소켓의 송수신 버퍼크기를 closesocket(sock); WSACleanup(); return 0; }
void ShowSocketBufSize(SOCKET sock) { int len;
len = sizeof(snd_buf); getsockopt(sock, SOL_SOCKET, SO_SNDBUF,(char*)&snd_buf, &len); // 해당 소켓의 송수신 버퍼크기를 snd_buf에 저장한다. len = sizeof(rcv_buf); getsockopt(sock, SOL_SOCKET, SO_RCVBUF,(char*)&rcv_buf, &len); // 해당 소켓의 송수신 버퍼크기를 rcv_buf에 저장한다. cout<<"수신 버퍼크기: "<<snd_buf<<endl; cout<<"송신 버퍼크기: "<<rcv_buf<<endl; } |
실행결과 |
|
기술문서:
발표자료:
|