socket 이란?
소켓이란 어플리케이션이 뭔가 데이터를 보내고 받을 때 양방향 통신을 하게 해주는 끝점이다. 따라서 어플리케이션은 소켓을 열고 소켓에게 정보를 주면 그 정보가 상대방 컴퓨터의 어플리케이션까지 가고 상대방 컴퓨터의 어플리케이션이 보낸 정보를 다시 소켓을 통해서 받는다.
소켓 연결은 일반적으로 LAN(Local Area Network) 또는 인터넷을 통해 서로 다른 두 컴퓨터 간에 실행되지만 단일 컴퓨터에서 프로세스 간 통신을 위해 사용될 수도 있다.
Berkeley Socket API
- 프로세스 간 통신(IPC)에 사용되는 인터넷 소켓 및 유닉스 도메인 소켓용 API(Application Programming Interface)입니다.
- 일반적으로 링크 가능한 모듈의 라이브러리로 구현되며 4.2에서 시작되었다BSD 유닉스 운영 체제는 1983년에 출시되었다.
- 버클리 소켓은 사실상의 표준에서 POSIX 사양의 구성 요소로 거의 수정되지 않고 발전하였다
Socket API function
socket()
- socket()은 정수 번호로 식별되는 특정 유형의 새 소켓을 생성하고 시스템 리소스를 할당한다. 오류가 발생하면 -1 리턴
- 세가지 인수를 사용한다.
=> domain: 생성된 소켓의 프로토콜 패밀리를 지정합니다.
=> type: 소켓의 종류를 지정한다 ex) tcp를 사용하는 경우 SOCK_STREAM, udp를 사용하는 경우 SOCK_DGRAM
=> protocol: 사용할 실제 전송 프로토콜을 지정하는 프로토콜이다. 가장 일반적인 것은 IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP이다.
bind()
- bind()는 일반적으로 서버 측에서 사용되며 소켓을 지정된 로컬 IP 주소 및 포트 번호와 같은 소켓 주소 구조와 연결합니다.
listen()
- listen()은 서버 측에서 사용되며 바인딩된 TCP 소켓을 수신 상태로 만듭니다.
connect()
- connect()는 클라이언트 측에서 사용되며 소켓에 사용 가능한 로컬 포트 번호를 할당합니다. TCP 소켓의 경우 새 TCP 연결을 설정하려고 시도합니다.
accept()
- accept()는 서버 측에서 사용됩니다. 원격 클라이언트로부터 새 TCP 연결을 만들기 위한 수신된 수신 시도를 수락하고 이 연결의 소켓 주소 쌍과 연결된 새 소켓을 만듭니다.
send(), recv(), sendto()와 recvfrom()
- send(), recv(), sendto()와 recvfrom()은 데이터 송수신에 사용됩니다. 표준 함수 write() 및 read()도 사용할 수 있습니다.
close()
- close()는 소켓에 할당된 리소스를 해제합니다. TCP의 경우 연결이 종료됩니다.