본문 바로가기

네트워크

[소켓프로그래밍] 기초 1. 소켓이란 무엇인가

728x90

# 일반 용어

네트워크에서 소켓이란

OSI 7 Layer ( Open System Interconnection 7 Layer )의 네 번째 계층인 TCP 상에서 동작하는 소켓을 주로 사용하는데

이를 TCP 소켓 혹은 TCP/IP 소켓 이라 합니다.

 

소켓의 역할

- 클라이언트 소켓 ( Client Socket )

 ` 서버 소켓에게 네트워크 연결 요청을 보냅니다.

 ` IP주소포트번호로 서버 소켓을 식별합니다.     

 ` 111.222.333.444:7000     // 밑 줄 친 부분이 IP 주소 : 굵은 부분이 포트 번호   

 

- 서버 소켓 ( Server Socket )

 ` 클라이언트 소켓의 네트워크 연결 요청을 받습니다.

 

클라이언트 소켓과 서버 소켓으로 구분지어 놨지만 역할이 다른 것일 뿐 동일한 소켓입니다.

연결 요청을 수행하는 소켓이냐, 연결 수신을 수행하는 소켓이냐를 구분할 뿐입니다.

 

- 클라이언트 소켓 API의 흐름

1) 생성 create

2) 연결 connet

3) 송수신 send / recv

4) 닫기 close

 

- 서버 소켓 API의 흐름

1) 생성 create

2) 결합 bind

3) 주시 listen

4) 수락 accept

5) 송수신 send / recv

6) 닫기 close

 

 

# 클라이언트 소켓 프로그래밍 Client Socket Programming

1) 클라이언트 소켓 생성 socket()

연결 요청을 보낼 소켓을 생성합니다.

- TCP 소켓은 Stream 타입으로

- UDP 소켓은 Datagram 타입으로 설정합니다.

 

2) 연결 요청 connect()

IP주소와 포트번호로 식별되는 서버 소켓인 Target에게 연결 요청을 합니다.

connect() API는 블록 ( Block ) 방식으로 동작하기 때문에

연결 요청에 대한 결과가 결정되기 전까지 connect() API의 실행이 끝나지 않습니다. 

연결 요청 결과에는 성공, 거절, 시간초과 등이 있습니다.

 

3) 데이터 송수신 send() , recv()

- send()는 데이터를 보내는 API

- recv()는 데이터를 받는 API 입니다.

 

역시 블록 ( Block ) 방식으로 동작하는 API로 성공, 실패, 종료가 되기 전에 API가 종료되지 않습니다.

데이터를 보낼 때는 보내는 소켓이 보내는 데이터의 양을 알 수 있지만

받는 소켓은 얼마나 많은 데이터가 들어올 지 알 수 없습니다.

그래서 recv() API는 별도의 스레드에서 실행됩니다.

소켓 생성 및 연결이 된 후 새로운 스레드를 만들어 그 곳에서 실행하고 데이터 수신대기를 하게 됩니다.

 

4) 소켓 닫기 close()

말 그대로 사용이 끝난 소켓을 닫는 것입니다.

한 번 닫으면 다시 열 수 없기 때문에, 다시 데이터 송수신을 하려면 새로운 소켓을 생성하고 연결해야 합니다.

 

 

# 서버 소켓 프로그래밍 Server Socket Programming

1) 서버 소켓 생성

- 클라이언트 소켓과 동일

 

2) 서버 소켓 바인딩  bind()

서버 소켓에 IP주소, 포트번호를 설정합니다.

그러면 클라이언트 소켓이 해당 서버 소켓을 식별하여 찾을 수 있게 됩니다.

포트번호는 0 ~ 65536 까지 있습니다.

 

3) 클라이언트 요청 대기 listen()

listen() API 는 클라이언트의 연결 요청이 수신되었는지 혹은 에러가 발생했는지만 판단합니다.

클라이언트의 연결 요청은 시스템 내부의 큐(Queue)에 쌓이게 됩니다.

이 시점에서 클라이언트와의 연결은 아직 완전히 연결되지 않은 대기 상태 ( not ESTABLISHED state ) 입니다.

큐(Queue)에서 대기중인 연결요청을 수락하는 것은 accept() API 입니다.

 

4) 클라이언트 연결 수립 accept()

서버 소켓은 연결 요청을 받고 수락하기만 할 뿐 실질적인 데이터 송수신을 수행하지 않습니다.

accept() API가 새로운 소켓을 만들고 큐(Queue)에서 꺼내온 연결 요청과 매핑시킵니다.

 

이제부터 데이터 송수신은 새로운 소켓이 담당하고,

서버 소벳은 다시 새로운 연결 요청을 기다리건, 소켓을 닫거나 하게 됩니다.

 

5) 데이터 송수신

클라이언트 소켓과 동일

 

6) 소켓 닫기 close()

클라이언트 소켓과 동일

하지만 서버 소켓은 본인만 닫는게 아니라

연결 수립 시 생성한 소켓도 관리해야 합니다.

 

728x90