작업 순서

Oak_Cassia·2022년 12월 21일
0

기차타고 전주가는 길
코딩은 할 수 없지만 시간을 잘 활용해야하니
순서를 구상해보자.

기본 뼈대

  1. 소켓 생성
  2. 바인드, 리슨
  3. 억셉트
  4. 데이터 수신
  5. 데이터 처리
  6. 데이터 전송

통신 구조

사실 여기는 이틀동안 구현했다. 멀티 스레드 어렵다.. 메모리 누수도 잡아냈다. (while로 더미 클라이언트 만들어서 다수의 데이터를 보냈다. 메모리 일정 수준 유지 성공)

accept는 IOCP로 안했다. 메인 스레드가 연결 요청을 받고 recv 호출까지 하고
그 뒤 부터 IOCP를 활용해서 멀티스레드로 recv ~ send 처리하게 했다. (이 구간에 연산이 많을 것이라 판단했다.)

데이터 처리

데이터를 받았다.이제 뭘 할까?
HTTP 규약에 맞는지 확인!
첫째 줄의 데이터만 확인했다. GET 방식이라 이곳이 가장 중요하다고 생각했다. 또 헤더길이가 고정된 것이 아니라 \r\n이 나올때 까지 계속 확인했다.

url 최대 길이에 근접한 2048로 버퍼 크기를 정했는데 분명히 뭔가 문제가 있을 것이다... 나중에 수정하자.
(tcp라 데이터가 짤려서 올 수도 있어서 체크하면서 누적시켜야 하는데, 데이터 크기가 작으니 일단 내버려 뒀다. tcp로 구현한다면 헤더 크기를 고정시킬 수 있어 편할텐데, HTTP의 이해가 부족하다...)

어쨌든
데이터를 받았다면
url을 확인한다. 세가지 경우가 있는데

  1. /
  2. /abcdefgh
  3. ?uml=abcdefghijklmnop

1번의 경우 메인 웹페이지를 보내주고
2번은 DB를 보고 존재하면 리디렉션 아니면 오류
3번은 DB에 존재하는지 보고 없으면 추가 후 짧은 URL 알려주기

와 개발 끝!(?)

DB 사용과 인덱스 알고리즘까지 만들면 이대로 끝일까??

나타날 수 있는 오류도 수정하고...
성능 개선까지 과연 갈 수 있을까?

어느새 도착할 때가 됐다.

profile
rust로 뭐할까

0개의 댓글