공부

20200905 공부

글로벌디노 2020. 9. 5. 21:34

소켓 옵션

코딩 연습

 

 

 

소켓 옵션

 

소켓 옵션 관련 함수

 

소켓 옵션을 설정할 때는 setsockopt() 함수를 사용

현재 설정된 소켓 옵션 값을 얻을 때는 getsockopt() 함수를 사용

setsockopt() 함수와 달리 getsockopt() 함수는 마지막 인자가 값-결과 인자임에 주의

 

 

SOL_SOCKET 레벨 소켓 옵션

optname optval 타입 get set 설명
SO_BROADCAST BOOL o o 브로드캐스팅 데이터 전송 허용 여부
SO_KEEPALIVE BOOL o o 주기적으로 연결 상태 확인 여부
SO_LINGER LINGER{ } o o 소켓 송신 버퍼에 미전송 데이터가 있을 때 closesocket( ) 함수의 리턴 지연 시간 설정
SO_SNDBUF
SO_RCVBUF
int o o 소켓 송/수신 버퍼의 크기 설정
SO_SNDTIMEO
SO_RCVTIMEO
int o o 데이터 송/수신 함수 호출 시 타임아웃 값 설정
SO_REUSEADDR BOOL o o 지역 주소(IP 주소, 포트 번호) 재사용 허용 여부

MSDN

 

 

IPPROTO_IP 레벨 소켓 옵션

optname optval 타입 get set 설명
IP_HDRINCL BOOL o o 데이터 송신 시 IP 헤더 직접 포함 여부
IP_TTL int o o IP 패킷의 TTL(time-to-live) 값 설정
IP_MULTICAST_IF IN_ADDR{ } o o 멀티캐스트 패킷을 보낼 인터페이스 선택
IP_MULTICAST_TTL int o o 멀티캐스트 패킷의 TTL 값 설정
IP_MULTICAST_LOOP BOOL o o 멀티캐스트 패킷의 루프백 여부
IP_ADD_MEMBERSHIP
IP_DROP_MEMBERSHIP
ip_mreq{ }   o 멀티캐스트 그룹 가입과 탈퇴

MSDN

 

 

IPPROTO_IPV6

optname optval 타입 get set 설명
IPV6_HDRINCL BOOL o o 데이터 송신 시 IP 헤더 직접 포함 여부
IPV6_TTL int o o IP 패킷의 TTL(time-to-live) 값 설정
IPV6_MULTICAST_IF DWORD o o 멀티캐스트 패킷을 보낼 인터페이스 선택
IPV6_MULTICAST_TTL int o o 멀티캐스트 패킷의 TTL 값 설정
IPV6_MULTICAST_LOOP BOOL o o 멀티캐스트 패킷의 루프백 여부
IPV6_ADD_MEMBERSHIP
IPV6_DROP_MEMBERSHIP
ipv6_mreq{ }   o 멀티캐스트 그룹 가입과 탈퇴

MSDN

 

 

IPPROTO_TCP

optname optval 타입 get set 설명
TCP_NODELAY BOOL o o Nagle 알고리즘 작동 여부

MSDN

 

 

 

코딩 연습

 

비트값 변경하기

#include <stdlib.h>
#include <stdio.h>

// 2바이트 16비트
// 비트를 컨트롤해보자
// 비트번호 1 ~ 16 입력
// On, Off 입력
// 해당 비트번호 수정
// 모든 비트 순서대로 출력

int main()
{
	unsigned short bits = 0;
	int input;
	int flag;

	while (1)
	{
		// 비트번호 입력
		printf_s("\n비트번호입력 (1 ~ 16) : ");
		scanf_s("%d", &input);

		// On, Off 입력
		printf_s("On/Off (1/0) : ");
		scanf_s("%d", &flag);

		// 해당 비트번호 수정
		unsigned short mask = 1 << (input - 1);

		if (flag)
			bits |= mask;
		else
			bits &= ~mask;

		system("cls");
		// 모든 비트 순서대로 출력
		mask = 0x8000;
		for (int i = 0; i < 16; i++)
		{
			printf_s("%2d번째 비트 : ", 16 - i);
			if (bits & mask)
				printf_s("TRUE\n");
			else
				printf_s("FALSE\n");

			mask >>= 1;
		}
	}


	return 0;
}

 

바이트 단위로 변경하기

#include <stdlib.h>
#include <stdio.h>

// 4바이트 바이트단위 컨트롤
// 바이트번호 1 ~ 4 입력
// 0 ~ 255 값 입력
// 해당 바이트 입력된 값으로 수정
// 모든 바이트 출력

int main()
{
	unsigned int data = 0;
	unsigned int mask;
	unsigned int val;
	unsigned int index;

	while (1)
	{
		// 바이트 번호 입력
		printf_s("\n번호(1 ~ 4) 입력 : ");
		scanf_s("%d", &index);

		// 값 입력 (0 ~ 255)
		printf_s("값(0 ~ 255) 입력 : ");
		scanf_s("%d", &val);

		// 해당 바이트 값 수정
		mask = 0xFF;
		mask <<= (index - 1) << 3;
		data &= ~mask;

		val <<= (index - 1) << 3;
		data |= val;

		system("cls");
		// 전체 출력
		mask = data;
		for (int i = 0; i < 4; i++)
		{
			printf_s("%d번째 %3d\n", i + 1, mask & 0xFF);
			mask >>= 8;
		}

		printf_s("0x%08X\n", data);
	}

	return 0;
}

'공부' 카테고리의 다른 글

Console창 생성 및 출력  (0) 2020.09.15
BMP 파일 이미지 데이터 읽기  (0) 2020.09.13
20200904 공부  (0) 2020.09.04
20200903 공부  (0) 2020.09.03
20200902 공부  (0) 2020.09.02