소켓 프로그래밍(Socket Programing)
˙소켓(Socket)
프로그램이 Network에서 데이터를 주고받을 수 있도록 연결하여 주는 요소이다. 보통 규약에 의거하여 Protocol에 맞게 만들어져야 한다. 일반적으로, OSI Layer*의 네 번째 계층인 TCP에서 동작하는 소켓을 주로 사용한다. 이를 주로 TCP 소켓 또는 TCP/IP* 소켓이라고도 부른다.
˙Client Socket & Server Socket
두 개의 System이 소켓을 통하여 Network에 연결되기 위해서는 최초 대상이 되는 곳에 대한 연결 요청이 필요하다. IP 주소 및 PORT 등과 같이 식별 가능한 대상에게 자신의 데이터(요청)를 진행하도록 설정한다. 단, 요청받는 곳에서도 요청받을 준비가 되어 있어야 하며, 준비가 되지 않는다면, 연결은 성공할 수가 없다. 따라서, 요청을 받는 곳에서도 어떠한 연결 요청이 수용될 것인지 미리 등록되어 있어야 하며, 처리 준비가 되어있어야 한다. 여기서, 요청을 보내는 쪽과 받아들이는 쪽으로 역할이 나뉘는데, 보내는 쪽이 Client Socket, 받아들이는 쪽이 Server Socket이 된다. 단, 위 Socket들은 별개의 Socket가 아닌 동일한 Socket으로, 역할에 따른 API 또는 함수의 호출 순서 등만 상이하다.
˙Socket API Flow
▷ CLIENT SOCKET
- socket() : 최초 socket을 생성하는 시점으로, 연결 대상에게 요청을 전달하기 위해서는, socket() 생성 후 connet() 호출 필요
- connect() : 연결대상의 IP:PORT로 연결 요청을 보내어, 요청에 대한 결과를 반환(성공, 실패, 시간 초과 등)
- send() : 연결된 socket을 통하여 데이터를 보낼 때에 사용(실행 결과가 종료될 때까지 API가 반환되지 않음)
- recv() : send()에서 실행 결과가 종료될 때까지 API가 반환되지 않기 때문에, 새로운 스레드를 생성한 후에 데이터가 수신 대기
- close() : 데이터 송신 또는 수신 등의 요청이 불필요하게 되면, socket을 닫기 위하여 close() API를 호출
▷ SERVER SOCKET
- bind() : 운영체제가 특정한 PORT 번호를 받아들일 수 있도록 만들기 위하여 socket과 PORT번호를 결합
- listen() : Client의 요청을 받아들일 준비가 된 후에, Client에 의한 연결 요청이 수신될 수 있도록 대기
- accept() : Socket 연결에 대한 요청을 받아들이는 요소로, 해당 API에서 생성된 연결이 받아들여진 Socket를 통하여 처리
- close() : 위의 CLIENT SOCKET과 동일한 역할을 하지만, accept()에 대한 요소도 관리
* OSI Layer : OSI(Open System Interconnection Reference Model) 계층으로 Network Protocol 디자인과 통신을 표현
* TCP/IP : 패킷 통신 방식의 Internet Protocol IP(인터넷 프로토콜)와 전송 조절 Protocol TCP(전송 제어 프로토콜)