minitalk은 시그널과 비트연산을 다루는 과제입니다.
클라이언트와 서버 프로그램을 각각 만들고, 그 두 프로그램이 통신하도록 하면 됩니다.
보너스를 구현하지 않으면 코드량이 많지 않고, 로직이 간단하기 때문에
마일스톤이 얼마 남지 않았다면 pipex보다는 minitalk을 추천합니다.
시그널이라는 용어를 처음 접하고 혼란스러웠는데,
그냥 클라이언트에서 서버에 1 또는 0으로 이루어진 데이터를 전달하는게 시그널이었습니다.
내가 입력한 문자가 그대로 전달되는 것이 아니라 1과 0으로 쪼개져서 전달되기 때문에
비트 연산에 대해서도 알고 있어야 합니다.
그래서 클라이언트 측의 로직은 아래와 같습니다.
1. 서버 프로세스의 PID와 전달할 데이터 입력받기
2. 예외처리하기
3. 입력받은 문자열을 문자단위로 쪼개기
4. 쪼개진 문자를 다시 비트 단위로 쪼개기
5. 쪼개진 비트를 서버에 전송
서버의 로직은 아래와 같습니다.
1. 본인(서버 프로그램)의 PID 확인 후 출력
2. 클라이언트의 신호를 대기
3. 클라이언트가 보낸 비트 단위의 신호를 문자 단위로 조립
4. 문자 단위로 조립된 데이터를 문자열 단위로 조립
4. 조립된 문자열을 출력
5. 다음 신호를 대기
간단해보이지 않나요?
실제로 코드도 간단합니다.
발생한 문제점도 명확했습니다.
비트 단위로 데이터를 전송하고 처리하다보니
빠르게 우다다다 신호가 처리되는데
클라이언트 측에서 신호를 전달하는 간격이
서버에서 처리하는 시간보다 짧아지면 오류가 발생합니다.
서버측에서 시그널을 처리할 시간이 부족해지다 보니
전달받은 시그널을 하나씩 건너뛰게 되어버리는 오류였습니다.
해결방법은 간단한데,
클라이언트 측에서 신호를 전달할때
일정 간격을 두고 전달하도록 하면 됩니다.
신호 전달 사이사이에 간격을 주어
서버가 신호를 처리할 시간을 주는 것입니다.
보너스에서는 이를 조금 더 명확하게 하기 위해
클라이언트 측에서 신호를 보내면
서버 측에서 처리를 완료하고, 다시 클라이언트에게 신호를 보냅니다.
클라이언트는 서버측의 완료 신호를 확인한 뒤 다음 신호를 보냅니다.
이렇게하면 신호 사이사이에 간격을 두지 않아도
시그널 씹힘 현상이 발생하지 않습니다.
(저는 보너스까지는 안함 ㅎ)
비트는 0 혹은 1을 표현할 수 있습니다.
이 비트를 8개 모으면 하나의 문자를 표현할 수 있으며
아스키코드표를 보면 80은 대문자 알파벳 P를 의미합니다.
갑자기 왜 아스키코드를...?싶겠지만
80은 2진수로 01010000입니다.
아까 비트 8개를 모으면 하나의 문자를 표현할 수 있다고 했죠?
01010000는 8개의 숫자로 이루어져있으며 10진수로 변환시 80을 의미합니다.
즉, 01010000은 대문자 알파벳 P를 의미합니다.
그럼 다시, client에서 입력받은 문자열은 문자단위로 쪼개고,
쪼개진 문자는 다시 비트단위로 쪼개서 server에 전송된다고 했습니다.
client에서 P를 입력받으면 컴퓨터는 이를 01010000으로 인지합니다.
(컴퓨터는 알파벳을 모릅니다. 0과1밖에 모르는 바보예요)
그리고 01010000을 비트단위로 쪼개서 서버에 전달하는겁니다.
0을 보내고
1을 보내고
0을 보내고
1을보내고
0을보내고
0을보내고...
그럼 서버에서는 0을 받고, 1을받고 ... 반복해서 01010000을 모두 받으면
아 이게 client가 보낸 데이터가 P를 의미하는구나! 라고 알아듣는겁니다.
참고로 컴퓨터는 영어를 이해할 수 없습니다.
컴퓨터가 0과 1만 알아듣는다는 사실 아시죠?
우리가 문자를 입력해도 컴퓨터는 문자그대로 이해하는게 아니라
0과1로 이루어진 2진수로 변환하여 이해합니다.
그래서 아래와 같은 기계어를 보면 0과 1로만 이루어져있는 것입니다.
'코딩 > 42경산' 카테고리의 다른 글
[42경산] valgrind와 메모리 누수 지옥 탈출하기 (0) | 2024.08.27 |
---|---|
[42경산] 까먹기전에 정리하는 so_long (0) | 2024.08.24 |
c언어로 isalpha, isdigit, isalnum, isascii, isprint 함수 구현하는 방법 (0) | 2024.03.19 |
짧지만 굵었던 42경산 피신 리로드 후기 (0) | 2024.02.28 |
비전공자의 42경산 1기 라피신 후기 (2) | 2023.12.31 |