본문 바로가기
일상,취미

다시 시작하는 TIL 28일차

by 진득한진드기 2024. 7. 20.

오늘 한일

 

오늘 진짜 하루종일 파일시스템 포팅하는거만 찾아봤다.

 

근데 포렌식 분석 하려고 보는 이미지 파일 분석 툴이 추출값이 안나온다.

 

기능 하나 하나가 되야 플랫폼을 만드는 계획을 짜는데 큰일이다.

 

carve 된 파일 분석하는 오픈소스를 좀 찾아보는데 오픈소스가 여러개로 분포 되어있어서 이거를 짜집어서 하나의 기능으로 만들기만 하면 될 거 같은데 좀 어려운거 같다 ㅋㅋㅎㅋ....

 

아직 아무것도 모르는 말하는 감자라 그런지 되는게 아무것도 없다.

 

심지어 내 개인 맥북에서 돌려봐도 뭘 잘못 만졌는지 python가 실행이 안되는 오류가 있었다.

 

파이썬 실행 프로그램으로 실행하면 되는데 안되는 이유를 몰라서 좀 많이 해맸다.

 

왜인지는 몰라도 중간에 심볼릭 링크가 끊어져서 안되었다고 파악되어서 겨우겨우 고칠 수 있었다.

 

마감기한이 얼마안남았는데 어떻게 해야될지 너무 막막하다.

 

그 전까지는 기한이 없어서 마음을 편하게 먹고 한거 같은데..... 데드라인을 주니까 좀 지옥이다.

 

퇴근 후 공부

 

소켓은 Select 계열과 MP(Multi Process) 계열이 존재하는데

 

저번에 MP계열의 가장 기초적인 부분을 해봤다.

 

Select계열의 기초를 보면 다음과 같다.

 

저번에 pipe를 통해 process끼리 통신했는데 그렇게 되면 프로세스를 만드는 비용이 어마어마 하게 된다.

 

그래서 이거를 상황에 맞춰서 사용해야한다.

 

생각보다 프로세스로 그렇게 무겁게 해야할 이유는 많이는 없다.

 

Select 계열은 들어온 요청들을 연결 하면서 중앙에서 잘 핸들링해주는 그런 계열의 소켓 통신 방식이다.

 

Select의 전체적인 그림


멀티 프로세스같은 경우 1 대 1 매칭이 되기 떄문에 더 우수할 것 같지만

실제로 게임에서 클라이언트와 서버에서 요청을 주고 받는건 생각보다 텀이 길고 크기가 작다.

실제로 그래서 하나의 프로세스가 다 처리할정도로 가능하다.

하나의 프로세스에서 관리하면 응답도 더 좋아진다.

그러면 하나의 프로세스에 여러 소켓이 생성되는 구조가 나오는데

이 여러 소켓을 관리해줄 fd_set이라는 것이 선언되어있다.

bitset 처럼 만약 그 소켓의 파일디스크립터 값을 체크한다.

근데 여기서 read나 write가 발생했을떄 누구를 대상을 할것인지를 정하는게 select함수이다.

select함수는 내가 어디로 진입해야되는지를 물어본다.

select는 해당 소켓의 파일디스크립터를 만나고 다른 소켓 파일 디스크립터는 다 삭제해버린다.

그래서 select전에 미리 복사해놔야한다.

그러면 이후에 선택한 곳을 다시 for문을 돌아서 찾아야한다.

그 이후로 그 파일디스크립터를 사용하여 read하고 write한다.

그리고 다시 원본을 사용해서 같은 루프로 돌아간다.

리스닝소켓으로부터 데이터를 읽을 게 있나? -> 있다. 결국 다 데이터의 흐름이기에

만약 read하는 데이터가 리스닝 소켓이다 라고 하면 이건 연결요청이다.


Select 함수의 기능과 호출순서



select 함수를 이용하면 배열에 저장된 다수의 파일 디스크립터를 대상으로 이와 같은 질문을 던질 수 있다.

수신한 데이터를 지니고 있는 소켓이 존재하는가?
블로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인가?
예외상황이 발생한 소켓은 무엇인가? => select는 예외가 발생한 소켓의 파일디스크립터를 가져올 수 있다.

ex)
FD_SET(1,&set) = 파일 디스크립터의 비트를 체크함


int select(int maxfd, fd_set p_readset, fd_set p_writeset, fd_set p_exceptset, const struct timeval p_timeout);


int maxfd = 검사 대상이 되는 파일 디스크립터

fd_set p_readset = fd_set형 변수에 '수신된 데이터의 존재여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소값을 전달

fd_set p_writeset = fd_set형 변수에 '블로킹 없는 데이터 전송의 가능여부'에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달

fd_set p_exceptset = fd_set형 변수에 '예외 상황의 발생여부'에 관심있는 파일디스크립터의 정보를 모두 등록해서 그변수의 주소값을 전달

const struct timeval p_timeout = select 함수호출 이후에 무한정 블로킹 상태에 빠지지 않도록 타임아웃을 설정하기 위한 인자를 전달

반환값 = 오류 발생시에는 -1이 반환되고, 타임 아웃에 의한 반환 시 에는 0이 반환된다. 그리고 관심대상으로 등록된 파일디스크립터에 해당 관심에 관련된 변화가 발생하면 0보다 큰 값이 반환되는데, 이 값은 변확 ㅏ발생한 파일 디스크립터의 수를 의미한다.


관찰의 대상이 되는 디스크립터의 수는 maxfd이며, 두 번째, 세 번째, 네 번째 인자를 통해서 전달된 관찰의 대상중에서 각각 입력 출력, 또는 오류가 발생했을 때 select함수는 반환을 한다.
단, timeout의 지정을 통해서 무조건 반환되는 시간을 결정할 수 있다.


'일상,취미' 카테고리의 다른 글

다시 시작하는 TIL 30일차  (3) 2024.07.23
다시 시작하는 TIL 29일차  (0) 2024.07.22
다시 시작하는 TIL 27일차  (0) 2024.07.18
다시 시작하는 TIL 26일차  (0) 2024.07.16
다시 시작하는 TIL 25일차  (0) 2024.07.12