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

+ Recent posts