← 목록
기타 2026-06-22 5KB 읽기 5분

크라우니 서버 패키지 v1.0

개요

재사용 가능한 한선씨 TCP/에코/HTTP 서버 빌딩블록 패키지. 순수 한선씨 + VM 내장 TCP 함수만 사용(외부 의존 0). 가져오기 "서버패키지" 한 줄로 모든 세션이 서버를 처음부터 다시 짜지 않고 재사용한다.

무엇을 했는지

  1. 에코 서버 작성·검증 — 포트 9090 TCP 에코 서버. 안녕 크라우니 왕복 확인.
  2. 크라우니 서버 패키지 구축 — 5개 공개 함수:
- TCP서버시작(포트, 처리함수) — 일반 TCP 서버 (람다 콜백) - 에코서버시작(포트) — 메아리 - 접두어에코서버시작(포트, 접두어) — 접두어 메아리 - HTTP서버시작(포트, 라우트맵) — 경로→본문 라우팅 HTTP - HTTP응답(상태, 본문) — 응답 조립
  1. 검증 — 3종 모두 PASS (에코 왕복 / echo> 안녕 / HTTP /·/health·404, 한글 본문 무손실).
  2. 크라우니코드 학습 등록tcp_echo_server, tcp_server_with_handler,
tcp_server_generic, http_simple_server intent로 학습DB 기록.
  1. 선언서 작성 — 정본 위치·계약·규칙적 사용법 동결.

관련 파일 경로

  • 패키지 소스: /Users/ef/Downloads/CrownyTVM/packages/크라우니서버/서버패키지.한선
  • 임포트 등록본: /Users/ef/Downloads/CrownyTVM/std/서버패키지.han
  • 매니페스트: packages/크라우니서버/패키지.json
  • 사용법: packages/크라우니서버/README.md
  • 선언서: packages/크라우니서버/선언.md
  • 예제: packages/크라우니서버/예제/{에코예제,접두어예제,http예제}.한선

실행

bashcd /Users/ef/Downloads/CrownyTVM
./target/release/crowny run packages/크라우니서버/예제/에코예제.한선
# 다른 터미널: nc 127.0.0.1 9090

VM 함정 (발견·동결)

  1. 콜백 = 변수 람다로만함수 핸들(d){...} 직접 전달은 미정의 변수 에러.
변수 핸들 = 함수(d){...} 로 담아 넘긴다. (함수명은 값으로 승격 안 됨)
  1. \r 미지원 — VM은 \r을 리터럴(백슬래시-r)로 남긴다. \n만 실제 개행.
HTTP 헤더 구분은 LF(\n)만 사용 — curl·브라우저 모두 수용.
  1. 글자수≠바이트수 — 한글은 글자당 3바이트. Content-Length를 글자수로 쓰면
본문이 잘린다. Content-Length 생략 + Connection: close로 본문 끝 표시.
  1. 가져오기 "네트워크.한선" 모듈 없음 — TCP대기/수락/읽기/쓰기/닫기는
VM 내장함수라 임포트 불필요. (리졸버는 import 문자열에 .han을 부착해 std 검색)

RPN 정통 동반본 (2026-06-23 추가)

헌법 상승경로(고수준 → RPN 정통 → 기계어)에 따라 에코 서버를 RPN 정본으로 변환.

  • 동반 파일: packages/크라우니서버/서버패키지.rpn.한선
  • 컴파일: cat 서버패키지.rpn.한선 | crownyc run hanseonc_std.toau > out.toau
  • 결과: hanseonc_std 컴파일 PASS (4032B TOAU), 메아리 왕복 PASS ([RPN 정통 메아리]).
  • 학습 등록: intent tcp_echo_server_rpn (RPN 정본).
  • 자동 변환기 high2rpn.sh는 함수호출 인자순서·중첩 라벨을 못 바꿔 손작성 RPN으로 작성.
정본 관용구는 std/네트워크유틸.rpn.han 참조.

RPN 정통 서버 운영화 — 컴파일러 패치 (2026-06-23, 정정)

⚠ 앞선 "TCP수락 논블로킹 = VM 한계" 진단은 오진이었다. 정정한다.

진짜 근본 원인: VM(crownyc)의 accept()는 원래 블로킹 정상. 문제는 RPN 정통 컴파일러(hanseonc_std)가 다음 키워드를 미인식한 것:

  • TCP대기/수락/읽기/쓰기/닫기(491~495) — 매핑 자체가 없음 → 변수취급 → fd=0 반환
accept(0)(stdin)은 즉시 반환 → 무한루프 폭주
  • 리터럴 → 0 방출(1이어야 함) → 무한루프 조건 즉시 탈출
  • 아니면점프(15b) → 미인식. 정답 키워드는 아니면(9b→JMPIFN 245)
(초기 "RPN 메아리 PASS"는 잔류 고수준 프로세스가 9090을 잡고 응답한 착시였다.)

수정: hanseonc_std.asm에 매치 블록 + emit 라벨 추가

  • TCP대기→491 … TCP닫기→495 (.emit_491~.emit_495)
  • →DATA 1 (.emit_true)
  • 아니면점프(15b)→@emit_245 별칭
  • 재조립: crownyc compile hanseonc_std.asm hanseonc_std.toau (9535→9922 큐브)
  • 원자 스왑(mv), 백업 hanseonc_std.{asm,toau}.bak.tcpfix_*
검증: 회귀 7/7 PASS. RPN 정통 에코 서버 — accept 블로킹(58B, 폭주 없음) + 무한루프 + 다중연결 메아리 PASS. 이제 RPN 정통 경로로 서버 운영 가능 (정식 toolchain). → 운영도 RPN 정통 가능. 고수준 경로도 그대로 유효.

남은 것: 거짓(DATA -1)은 음수 데이터 방출(부호배열 mem[30000+]) 경로라 미추가 — 차기. 비교(크다/작다)가 -1을 직접 생성하므로 실용 영향 적음.

잔여 이슈

  • 동시 다중 클라이언트 미지원(단일 루프, 순차 처리). 동시성 필요 시 차기 버전.
  • HTTP 경로만 라우팅(메서드 무시). POST/쿼리 파싱은 차기 확장.
  • 정통 VM TCP수락 논블로킹 → 무한루프 스택 누적. 블로킹 accept 구현 필요.