눈팅하는 게임개발자 블로그

Socket Programming 본문

공부한거/네트워크 프로그래밍

Socket Programming

Palamore 2020. 9. 25. 17:56

Socket

TCP/UDP IP 환경에서 통신을 위한 통로.

send / recv 함수를 통해 Data 송/수신

IP + Port 번호로 구성

예 ) 220.66.10.11(해당 컴퓨터의 IP 주소) + 80(해당 프로세스가 사용하는 Port No.) ==> 220.66.102.11:80

 

Client / Server 통신 절차

TCP 통신의 경우 연결 설정을 한 후 연결이 해제될 때까지

지속적으로 send, recv함수를 통해 통신이 가능하고 (전화 연결과 같다.)

UDP 통신의 경우 연결 설정 과정 없이

한 쪽에서 한 쪽으로 메시지를 보내는 것 처럼 통신이 가능하다. (문자 메시지 전송과 같다.)

 

Socket API

소켓 함수들

TCP API

socket() - 소켓을 생성하는 함수, 생성된 소켓의 디스크립터를 반환

connect() (client) - 목적 서버와 소켓을 연결

bind() - 소켓에 소켓 주소를 부여

listen() - 소켓을 활성화.

accept() (server) - 서버가 클라이언트의 connect()함수를 대기한다. client측에서 connect()함수 실행 시 연결된다.

send() - 연결이 설정된 상대 소켓에 데이터를 송신.

recv() - 연결이 설정된 소켓에서 데이터를 수신.

closesocket() - 소켓을 삭제. (리눅스의 경우 close())

 

UDP API

socket() - 소켓 생성 함수.

sendto() - 상대 소켓에 데이터를 송신.

recvfrom() - 상대 소켓으로부터 데이터를 송신.

closesocket() - 소켓을 삭제. (리눅스의 경우 close())

 

Socket API 흐름

TCP

클라이언트와 서버를 연결할 시

클라이언트 쪽의 connect()함수가 실행되기 전에

서버 쪽의 accept()함수가 먼저 실행되어야 한다.

 

UDP

 

주소의 표현

소켓 주소

프로토콜의 종류에 따라 사용하는 주소의 체계가 다르다.

AF_UNIX : 한 호스트에 존재하는 프로세스 사이의 통신을 지원.

AF_INET : 다른 호스트에 존재하는 프로세스 사이의 통신을 지원.

 

유닉스의 주소 체계는 파일 시스템의 경로명을 기반으로 함.

struct sockaddr_un {
	short sun_family;   // AF_UNIX
	char sun_path[108]; // pathname
};

 

인터넷 주소 체계는 32비트 IP 주소와 16비트 포트 번호를 기반으로 함.

struct sockaddr_in {
	short sin_family;		 // AF_INET
    u_short sin_port;		 // Port number
    struct in_addr sin_addr; // IP Address
    char sin_zero[8];		 // Padding
};

struct in_addr {
	u_long s_addr;
};

 

통합 주소 체계

프로토콜마다 주소 체계를 지원하는 문법 구조가 다름.

문법 구조상 하나의 함수에서 다양한 주소 체계를 지원하는 데 어려움이 있음.

따라서 모든 주소 체계를 수용할 수 있는 공통 주소 체계가 필요하다.

struct sockaddr {
	u_short sa_family;
    char sa_data[14];
};

사용 예

addr : 주소 공간 자체는 해당 프로토콜의 주소 체계로 선언 (예의 경우 인터넷 주소 체계)

bind() 함수의 두 번째 매개 변수는 문법적으로 공통 주소 체계만 수용

struct sockaddr_in addr; 					//인터넷 주소 체계로 변수 선언
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);	// IP 주소
addr.sin_port = htons(5010);				// Port 번호
bind(socket, (struct sockaddr *)&addr, sizeof(addr));

 

소켓 유형

SOCK_STREAM

연결형 서비스를 지원, AF_INET에서는 TCP 프로토콜을 사용.

SOCK_DGRM

비연결형 서비스를 지원, AF_INET에서는 UDP 프로토콜을 사용.

SOCK_RAW

IP 프로토콜을 직접 사용

 

 

'공부한거 > 네트워크 프로그래밍' 카테고리의 다른 글

TCP/IP 환경  (0) 2020.09.25
네트워크 이론  (0) 2020.09.25