728x90
소켓의 옵션
- 소켓이 가지고 있는 기본 특성 중에서 선택하여 바꿀 수 있는 것을 옵션이라고 구분지어 설명
- 프로토콜 레벨로 구분되고 그 안에서 옵션이 나뉘어짐
- SOL_SOCKET : 소켓의 일반적인 옵션을 그룹화함
- IPPROTO_IP : IP 프로토콜에 대한 옵션을 그룹화함
- IPPROTO_TCP : TCP 프로토콜에 대한 옵션을 그룹화함
- Get, Set : 얻어오거나 설정가능 여부
-> 예를들어 SO_TYPE은 TCP / UDP 옵션인데 한번 설정하면 변경이 불가능하기 때문에 Set은 불가능
옵션 정보를 참조하고 바꾸는 함수
- getsockopt : 옵션 정보를 참조하는 함수
-> level : 위의 표에서 Protocol Level
-> optname : 위의 표에서 Option Name
-> optval : 옵션 정보를 담을 공간
#include <sys/socket.h>
int getsockopt(int sock, int level, int optname, void* optval, socklen_t* optlen);
- setsockopt : 옵션 정보를 설정하는 함수
-> level : 위의 표에서 Protocol Level
-> optname : 위의 표에서 Option Name
-> optval : 옵션 정보를 저장한 버퍼의 주소값
#include <sys/socket.h>
int setsockopt(int sock, int level, int optname, const void* optval, socklen_t* optlen);
int main(int argc, char *argv[])
{
WSADATA wsaData;
SOCKET hSock;
int sndBuf, rcvBuf, state, len, socktype;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
printf("WSAStartup() error!\n");
hSock=socket(PF_INET, SOCK_STREAM, 0);
len=sizeof(socktype);
state=getsockopt(hSock, SOL_SOCKET, SO_TYPE, &socktype, &len);
printf("sock type %d\n",socktype);
if(state)
printf("getsockopt() error\n");
socktype = SOCK_DGRAM;
state=setsockopt(hSock, SOL_SOCKET, SO_TYPE, &socktype, &len); // set이 안되는 옵션을 set할 경우 실패
if(state)
printf("setsockopt() error\n");
len=sizeof(sndBuf);
state=getsockopt(hSock, SOL_SOCKET, SO_SNDBUF, &sndBuf, &len); // 송신 버퍼 크기 get
if(state==SOCKET_ERROR)
printf("getsockopt() error\n");
len=sizeof(rcvBuf);
state=getsockopt(hSock, SOL_SOCKET, SO_RCVBUF, &rcvBuf, &len); // 수신 버퍼 크기 get
if(state==SOCKET_ERROR)
printf("getsockopt() error\n");
printf("Input buffer size: %d \n", rcvBuf);
printf("Output buffer size: %d \n", sndBuf);
sndBuf=1024*3, rcvBuf=1024*3;
state=setsockopt(hSock, SOL_SOCKET, SO_SNDBUF, &sndBuf, sizeof(sndBuf));
// 송신 버퍼 크기 set
if(state==SOCKET_ERROR)
printf("setsockopt() error!\n");
state=setsockopt(hSock, SOL_SOCKET, SO_RCVBUF, (char*)&rcvBuf, sizeof(rcvBuf));
// 수신 버퍼 크기 set
if(state==SOCKET_ERROR)
printf("setsockopt() error!\n");
len=sizeof(sndBuf);
state=getsockopt(hSock, SOL_SOCKET, SO_SNDBUF, (char*)&sndBuf, &len);
if(state==SOCKET_ERROR)
printf("getsockopt() error\n");
len=sizeof(rcvBuf);
state=getsockopt(hSock, SOL_SOCKET, SO_RCVBUF, (char*)&rcvBuf, &len);
if(state==SOCKET_ERROR)
ErrorHandling("getsockopt() error\n");
printf("Input buffer size: %d \n", rcvBuf);
printf("Output buffer size: %d \n", sndBuf);
closesocket(hSock);
WSACleanup();
return 0;
}
- 기본 버퍼 크기는 65536으로 확인되는데 시스템마다 다를 수 있음
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 09-3. TCP_NODELAY (2) | 2021.02.24 |
---|---|
열혈 TCP/IP 09-2. SO_REUSEADDR (0) | 2021.02.23 |
열혈 TCP/IP 08-2. IP주소와 도메인 이름 사이의 변환 (0) | 2021.02.21 |
열혈 TCP/IP 08-1. Domain Name System (0) | 2021.02.21 |
열혈 TCP/IP 07-1. TCP 기반의 Half-close (0) | 2021.02.21 |