[네트워크 프로그래밍] 5. Socket option

유기태·2023년 11월 25일
0

setsockopt/msdn

Socket

네트워크 상에서 서로의 소통 창고라고 보면됩니다.

Socket Option

소켓에 옵션을 설정하거나, 옵션을 가져오는 역할을 하는 함수입니다.

::setsockopt()

::getsockopt()

parameter
  1. Socket
  2. Level
  • Socket레벨이면 SOL_SOCKET
  • IP 레벨이면 IPPROTO_IP
  • TCP 레벨이면 IPPROTO_TCP
  1. optname
SOL_SOCKET
  • SO_KEEPALIVE (TCP only) : 주기적으로 연결 상태 확인 여부
  • SO_LINGER : 연결을 지연하다. 송신 버퍼에 있는 데이터를 날릴것인가? 보낼것인가?
  • SO_RCVBUF : 수신 버퍼에 사이즈(변경 및 확인 용)
  • SO_SNDBUF : 송신 버퍼에 사이즈(변경 및 확인 용)
  • SO_REUSEADDR : 갑자스러운 중단으로 다른 소켓이 IP와 Port를 점유중일 때 해당 IP Port를 강제로 가져올 수 있게 만다는 옵션

IPPROTO_TCP

  • TCP_NODELAY
  • TCP에 Nagle 알고리즘(작은 패킷들이 많이 생성돼 트래픽에 장애를 주는것을 예방하기 위한 알고리즘) 을 키고 끌 수 있는 옵션이다.
  1. optval
  • 해당 옵션에서 사용할 옵션의 값을 가져오거나 셋팅할 수 있다.
  1. optlen
  • optval 즉, 해당 옵션의 값에 대한 사이즈를 뜻함

사용 예제

bool enabled = true;
	::setsockopt(serverSocket, SOL_SOCKET, SO_KEEPALIVE, (char*)enabled, sizeof(enabled));

	// onoff = 0이면 closesocket()이 바로 리턴, 아니면 linger초 만큼 대기(default 0)
	LINGER linger;
	linger.l_onoff = 1;
	linger.l_linger = 5;
	// 대기 시간
	::setsockopt(serverSocket, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));
	//::getsockopt();

	// Half-close
	// SD_SEND : send 막는다.
	// SD_RECEIVE :recv 막는다.
	// SD_BOTH : 둘 다 막는다.
	// 나는 더 이상 할 애기 없다고 의사 표시를 하게됨
	//::shutdown(serverSocket, SD_SEND);

	// SO_SNDBUF = 송신 버퍼 크기
	// SO_RCVBUF = 수신 버퍼 크기
	int32 sendBufferSize;
	int32 optionLen = sizeof(sendBufferSize);
	::getsockopt(serverSocket, SOL_SOCKET, SO_SNDBUF, (char*)&sendBufferSize, &optionLen);

	cout << "송신 버퍼 크기:" << sendBufferSize << endl;

	int32 recvBufferSize;
	optionLen = sizeof(recvBufferSize);
	::getsockopt(serverSocket, SOL_SOCKET, SO_SNDBUF, (char*)&recvBufferSize, &optionLen);

	cout << "수신 버퍼 크기:" << recvBufferSize << endl;

	// SO_REUSEADDR
	// 점유중인 IP 주소 나 PORT를 강제적으로 끊어 쓸 수 있게 만드는 방법
	// IP주소 및 port 재사용
	{
		bool enabled = true;
		::setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&enabled, sizeof(enabled));
	}

	// IPPROTO_TCP
	// TCP_NODELAY = Nagle 알고리즘 작동 여부
	// 데이터가 충분히 크면 보내고 좀 작다 싶다면 데이터가 충분히 쌓일 때까지 대기
	// 장점 : 작은 패킷이 불필요하게 생성되는 일을 방지
	// 단점 : 반응 시간의 손해를 
	{
		// Nagle Algorithm on/off
		bool enabled = true;
		::setsockopt(serverSocket, IPPROTO_TCP, TCP_NODELAY, (char*)&enabled, sizeof(enabled));
	}
profile
게임프로그래머 지망!

0개의 댓글