티스토리 뷰
소켓의 처리 흐름에 대해서 잘 정리한 사진이 있어 가져왔다.
먼저 클라이언트 소켓의 흐름을 보자.
- 소켓 생성
- 서버 측에 연결
- 서버 소켓에서 연결을 받으면 데이터를 송수신
- 모든 처리가 완료되면 소켓을 닫음
서버측 소켓의 흐름이다.
- 소켓 생성
- 서버가 사용할 IP 주소와 포트 번호를 생성한 소켓에 결합
- 클라이언트로부터 연결 유청이 수신되는지 주시
- 요청이 수신되면 accpet 후 소켓 생성
- 데이터 송수신
- 소켓 닫음
3. 클라이언트 소켓 프로그래밍
위와 같은 흐름으로 클라이언트 실행 흐름이 진행된다.
이제 좀 더 상세하게 클라이언트 소켓 프로그래밍에 대해서 정리해보자.
3.1 클라이언트 소켓 생성 : socket()
소켓 통신을 위해 가장 먼저 해야 할 일은 소켓을 생성하는 것이다. 이 때 소켓의 종류를 지정할 수 있는데, TCP 소켓을 위해서는 스트림 타입, UDP 소켓을 위해서는 데이터그램 타입을 지정할 수 있다.
최초 소켓이 만들어지는 시점에는 어떠한 연결 대상에 대한 정보도 들어 있지 않다. 그러기에 연결 대상 즉, IP 와 Port 을 지정하고 연결 요청을 전달하기 위해서는 생성한 소켓을 사용하여 connect() API를 호출해야 한다.
3.2 연결 요청 : connect()
connect() API는 IP주소와 포트 번호로 식별되는 대상으로 연결 요청을 보낸다.
connect() API는 블록 방식으로 동작하기에, 연결 요청에 대한 결과가 결정되기 전에는 connect()의 실행이 끝나지않고 대기한다.
호출이 성공하면 send() / recv() API 를 통해 데이터를 송수신 할 수 있다.
3.3 데이터 송수신 : send() / recv()
연결된 소켓을 통해 데이터를 보낼 때는 send() 수신에는 recv() API를 사용한다.두 API 모두 connect와 동일하게 블럭 방식으로 동작한다.
그러므로 두 호출이 모두 결과가 결정되기 전까지 API가 리턴되지 않는다.
특히 recv() 같은 경우는 한번 실행되면 언제 어떤 데이터가 전송되어 올 것인지 알 수 없기때문에, 데이터 수신을 위해서 별도의 스레드를 실행하여 데이터 수신을 기다린다.
3.4 소켓 닫기 : close()
데이터 송수신이 필요없게 되면, 소켓을 닫기 위해 close() API를 호출한다. 해당 소켓은 닫힌 이후에는 재사용이 불가능하다.
4. 서버 소켓 프로그래밍
클라이언트 소켓 프로그래밍은 상당히 직관적이나 서버 소켓 프로그래밍은 반면 좀 더 복잡해보일 수 있다.
4.1 서버 소켓 생성 : socket()
클라이언트와 동일하게 소켓을 생성한다.
4.2 서버 소켓 바인딩 : bind()
bind의 사용되는 파라미터는 포트 번호 혹은 IP 주소 + 포트 번호이다. 시스템 상에서 많은 수의 프로세스가 동작하기에 서버에 접근할 수 있는 가상화된 포트를 지정해야 한다. 운영체제는 소켓들이 중복된 포트 번호를 사용하지 않도록, 내부적으로 포트 번호와 소켓 연결 정보를 관리하는데, bind() 호출과정에서 중복되는 포트 사용이 있으면 운영체제가 포트 할당을 거부하고, API는 에러를 리턴한다.
4.3 클라이언트 연결 요청 대기 : listen()
서버 소켓에 포트 번호를 결합하고 나면, 서버 소켓을 통해 클라이언트의 요청을 받을 준비가 되었다. 클라이언트의 연결 요청이 수신될때까지 한없이 세월아 네월아 기다려야 한다. 대기 상태를 빠져나오는 경우도 있는데 이때는 요청이 수신되는 경우와, 에러가 발생하는 경우다.
클라이언트 연결 요청에 대한 정보는 시스템 내부적으로 관리되는 큐에 쌓이게 됨으로, 대기 중인 연결 요청을 큐로부터 꺼내와서, 연결을 수립하기 위해서는 accept() 를 호출하면 된다.
4.4 클라이언트 연결 수립 : accept()
최종적으로 accept() 을 호출해서 소켓 간 연결이 수립이 된다. 여기서 한가지 독특한 부분은 accept() 가 호출되어 소켓 간 연결을 수립할 때 새로운 소켓을 만들어 연결하게 된다. 그럼 여기서 서버 소켓의 역할은? 단순히 클라이언트 연결을 대기하고 연결 수립 요청을 하고 소켓을 닫는 것이다.
4.5 데이터 송수신 : send() / recv()
클라이언트와 동일하다.
4.6 소켓 연결 종료 : close()
클라이언트와 동일하다. 하지만 서버 소켓의 경우 클라이언트와 연결을 수립했던 소켓뿐만 아니라 클라이언트의 연결을 대기하는 소켓 또한 닫아줘야 함으로 유의해야 한다.
'개발 지식 정리' 카테고리의 다른 글
딥러닝 지식 정리 (0) | 2022.04.15 |
---|---|
[C언어/C++] memset 함수 메모리 초기화 (0) | 2022.04.05 |
지도 기능 개발 (0) | 2022.03.29 |
네이버의 검색 알고리즘 그리고 알고리즘들 (0) | 2022.03.16 |
노코드 프로그램 (0) | 2022.03.15 |
- Total
- Today
- Yesterday
- 주가반영
- 크래프톤
- 신은영대표
- 2과목 소프트웨어 개발
- 자연어처리 #TIL
- 식별자오류
- 빅데이터 #데이터분석
- 뱅샐
- 테크스펙
- IT주식
- sap코리아
- 인공지능투명성
- CBDC
- 빅데이터분석 #데이터분석실무 #포스코빅데이터아카데미
- 신입일기
- 극단적선택
- 주가부양책
- 신입개발자일기
- 대혐오시대
- IT뉴스브리핑
- 20대대통령
- 신은영
- 종만북
- 유엔여성기구성평등센터
- 데이터분석실무 #포스코빅데이터아카데미
- 포스코 #데이터사이언스 #데이터분석
- 김정주이사
- 인공지능윤리성
- 여성대표
- 개발자일기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |