소켓 옵션
소켓 옵션 관련 함수
소켓 옵션을 설정할 때는 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 주소, 포트 번호) 재사용 허용 여부 |
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 | 멀티캐스트 그룹 가입과 탈퇴 |
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 | 멀티캐스트 그룹 가입과 탈퇴 |
IPPROTO_TCP
optname | optval 타입 | get | set | 설명 |
TCP_NODELAY | BOOL | o | o | Nagle 알고리즘 작동 여부 |
코딩 연습
비트값 변경하기
#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 |