본문 바로가기
프로그램 개발/MYSQL

[리눅스/linux] 소켓접속 알고리즘 / Socket Connection algorithm

by 코딩히어로 2020. 4. 9.

소켓통신 프로그램을 만들다 보면 이러한 고민들을 한번쯤 해보게 된다.

 

바로 통신시에 필요한 fd를 어떻게 할 것인가?

 

fd를 다루기에 앞서서 소켓이 바뀌어 들어오거나 하는 경우등을 생각해야 한다

 

말로는 설명이 애매하니 아래 그림을 보면서 설명하겠다

 

예를들어 서버에 접속하는 3개의 소켓이 있다고 가정하자

 

DB에 저장하기 앞서 구분하기 쉽게 고유코드의 ID값을 지정해준다

 

그리고 이것을 DB상에 저장을 하면 아래와 같이 저장한다

 

이렇게 저장해서 서버에서 해당 Client로 데이터를 보내고자 할 때

 

Select socket_num from table where 0001

 

이렇게 fd값을 가져와서 write 해주면 전송이 잘 되는것을 확인 할 수 있다

 

그런데 문제는 이런 보통적인 상황이 아니라 여러가지 변수에 의해 만들어진다

 

자 위와같이 소켓 1번과 3번이 어떠한 이유에 의해 통신망에서 끊어져 나갔다

 

그리고 소켓이 재접속을 시도하는데 id값 0001번 보다 0003번이 먼저

 

서버에 접속하고 소켓의 번호가 다르게 들어온다면

 

소켓의 fd값이 변경된 상황으로 현재 데이터 베이스에 저장된 테이블을

기존과 같이 조회하면??

 

Select socket_num from table where 0001

 

조회된 값은 socket_num 1이 조회된다

 

하지만 socket_num 1은 현재 0003아이디의 소켓이다

 

즉 내가보내고자 하는 id는 0001번으로 보내야 하지만

 

현재 소켓의 재접속에 의해 테이블을 업데이트 하지 않으면 전혀 엉뚱한

 

목적지인 0003번으로 메세지가 전송되게 되는 것이다

 

자 그럼 여기서 생각해 볼 수 있는 알고리즘에 대해 알아보자

 

제일 중요한 고유값을 정하는게 첫번째이다

 

고유값은 절대 그 값이 변하지 않는 상수로써 id값이 적당하다

 

그럼 id값을 기준으로 다음과 같은 알고리즘을 설계 할 수 있다

 

해당 알고리즘을 기준으로 프로그램을 만들면

 

소켓 접속변경에 대해 대응이 가능하다

 

댓글