현생/TCP 소켓 프로그래밍

9-2. 소켓의 타입을 확인하는 소켓의 옵션 [TCP/IP][C][LINUX]

푸더기 2022. 1. 24. 22:34
반응형

 

프로토콜 레벨 SOL_SOCKET에 있는 SO_TYPE 옵션은 소켓의 타입정보를 확인하는 옵션입니다.

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
void error_handling(char *message);

int main(int argc, char *argv){
	int tcp_sock, udp_sock;
	int sock_type;
	socklen_t optlen;
	int state;
	
	optlen=sizeof(sock_type);
    // tcp/udp 소켓 생성
	tcp_sock=socket(PF_INET, SOCK_STREAM, 0); 
	udp_sock=socket(PF_INET, SOCK_DGRAM, 0);
    
    //tcp/udp 소켓 생성 시 2번째 인자로 들어간 상수 값 출력
	printf("SOCK_STREAM: %d\n",SOCK_STREAM);
	printf("SOCK_DGRAM: %d\n",SOCK_DGRAM);
	
    
    //tcp소켓의 타입정보 얻음.
	state=getsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, (void*)&sock_type, &optlen);
	if(state)
		error_handling("getsockopt() error");
	printf("Sock type one: %d\n", sock_type);
	
    //udp소켓의 타입정보 얻음.
	state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, (void*)&sock_type, &optlen);
	if(state)
		error_handling("getsockopt() error");
	printf("Sock type two: %d\n", sock_type);
	return 0;
}

void error_handling(char *message){
	fputs(message, stderr);
	fputc('\n',stderr);
	exit(1);
}

SOCK_STREAM의 값과 SOCK_DGRAM의 값은 각각 1, 2입니다.

getsockopt() 함수로 얻어 낸 두 소켓의 타입정보는 각각 1과 2로 위 상수와 동일합니다.

 

또, SO_TYPE은 확인만 가능하고 변경이 불가능한 옵션 중 하나로, 소켓의 타입은 소켓 생성시 결정되면 변경이 불가능합니다.

반응형