본문 바로가기

프로그래밍/ 리눅스

버클리소켓 연결

 # 리눅스 소켓

리눅스 소켓은 socket( domain, type, protocol ); 이라는 시스템 호출로 생성 한다.

모든 응용프로그램에서 프로토콜은 항상 0으로 지정한다. (왜? -_-;)

 

맨 앞에 파라메터값중 도메인은 소켓을 식별하는 방법이다.

도메인의 종류에는 유닉스 ( AF_UNIX ), IPv4 ( AF_INET ), IPv6 ( AF_INET6 ) 이 있다.

AF_UNIX 도메인은 동일한 호스트 내 응용 프로그램간의 통신을 지원 한다.

AF_UNIX 커널 내부를 통신 수단으로 사용 하며, 동일 호스트간의 통신을 지원한다. 주소 포멧은 경로명을 사용하며, sockaddr_un 구조체를 사용 한다.

AF_INET는 IPv4를 통신 수단으로 사용 하며, IPv4로 연결된 호스트간의 통신을 지원한다. 주소 포멧은 32비트 IPv4주소+16비트 포트 번호를 사용 하며, sockaddr_in 구조체를 사용 한다.

AF_INET6은 IPv6를 통신 수단으로 사용 하며, IPv6로 연결된 호스트간의 통신을 지원한다. 주소 포멧은 128비트 IPv6주소+16비트 포트 번호를 사용 하며, sockaddr_in6 구조체를 사용 한다.

 

# 소켓의 종류

모든 소켓은 스트림과 데이터그램이라는 두 종류의 소켓을 지원 한다.

 

스트림 소켓은 안정적인 양방향의 바이트 스트림 통신 채널을 제공 한다.

여기서 양방향 이라는 말은 두 소켓 사이의 데이터 전송이 양방향으로 이뤄 질 수 있음을 의미 한다.

바이트 스트림이란 파이프를 통하며, 메시지의 경계가 없음을 의미 한다.

스트림 소켓은 양방향 통신을 위해 한쌍의 파이프를 사용 하며, 연결 지향(connection-oriented)이다.

peer socket이라는 용어는 연결된 상대편 소켓을 가리킨다. peer address란 상대편 소켓의 주소를 가리키고, peer application은 해당 피어 소켓을 이용하는 응용 프로그램을 가리 킨다.

때로는 remote, foreign 이라는 말이 peer과 동일한 의미로 사용 된다. 마찬가지로 local은 자신을 가리키는데 사용 된다. 하나의 스트림 소켓은 오직 1개의 피어에 연결 될 수 있다.

 

데이터그램은 메시지 경계가 보전되는 반편, 데이터 전송은 안정적이지 않다. 메시지 순서가 뒤바뀔 수 있고, 중복되기도 하며, 아예 도착하지 않는 경우도 있다.

데이터그램 소켓은 연결성이 없는(connectionless) 소켓이다. 스트림과 달리 다른 소켓에 연결되지 않은 상태로도 사용 할 수 있다.

 

 

socket() 새로운 소켓 생성

bind() 소켓을 주소로 연결, 서버에서 bind() 를 사용해 자신의 소켓을 결속 시키고, 클라이언트는 해당 주소로 소켓을 연결 할 수 있다.

listen() 스트림 소켓이 다른 소켓으로 부터의 연결을 기다리게 한다.

accept() 상대편 응용 프로그램으로부터 연결을 기다리는 소켓으로의 연결 요청을 받아 들인다. 서택 사항으로 피어 소켓의 주소를 리턴 할 수 있다.

connect() 다른 소켓과 연결을 맺는데 사용 된다.

 

I/O

read() write() 을 이용 하여 할 수 있다. 기본적으로 블로킹 상태이며, fcntl()의 FSETFL을 이용해 파일 상태 플래그를 O_NONBLOCK로 설정해 논블로킹 I/O로 사용 할 수도 있다.

커널 2.6.27 이후 부터는 type 인자에 표준이 아닌 플래그를 or 연산 할 수 있도록 허용 되었다.

예를들어서.. SOCK_STREAM | SOCK_NONBLOCK 로 설정하면 fcntl() 호출 없이도 동일한 결과를 얻을 수 있다.

 

 

#include <sys/socket.h>

int socket( int domain, int type, int protocol );

반환되는 int값은 fd(파일 디스크립터)이다. 에러가 발생하면 -1 을 리턴한다.

fd는 소켓을 가리키고 있으며 ioctl을 이용하여 아직 읽지 않은 가용 바이트 수를 얻어 올 수 있다.