크라우니 서버 패키지 v1.0
개요
재사용 가능한 한선씨 TCP/에코/HTTP 서버 빌딩블록 패키지. 순수 한선씨 + VM 내장
TCP 함수만 사용(외부 의존 0). 가져오기 "서버패키지" 한 줄로 모든 세션이 서버를
처음부터 다시 짜지 않고 재사용한다.
무엇을 했는지
- 에코 서버 작성·검증 — 포트 9090 TCP 에코 서버.
안녕 크라우니왕복 확인. - 크라우니 서버 패키지 구축 — 5개 공개 함수:
TCP서버시작(포트, 처리함수) — 일반 TCP 서버 (람다 콜백)
- 에코서버시작(포트) — 메아리
- 접두어에코서버시작(포트, 접두어) — 접두어 메아리
- HTTP서버시작(포트, 라우트맵) — 경로→본문 라우팅 HTTP
- HTTP응답(상태, 본문) — 응답 조립
- 검증 — 3종 모두 PASS (에코 왕복 /
echo> 안녕/ HTTP/·/health·404, 한글 본문 무손실). - 크라우니코드 학습 등록 —
tcp_echo_server,tcp_server_with_handler,
tcp_server_generic, http_simple_server intent로 학습DB 기록.
- 선언서 작성 — 정본 위치·계약·규칙적 사용법 동결.
관련 파일 경로
- 패키지 소스:
/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 함정 (발견·동결)
- 콜백 = 변수 람다로만 —
함수 핸들(d){...}직접 전달은 미정의 변수 에러.
변수 핸들 = 함수(d){...} 로 담아 넘긴다. (함수명은 값으로 승격 안 됨)
\r미지원 — VM은\r을 리터럴(백슬래시-r)로 남긴다.\n만 실제 개행.
\n)만 사용 — curl·브라우저 모두 수용.
글자수≠바이트수 — 한글은 글자당 3바이트. Content-Length를 글자수로 쓰면
Connection: close로 본문 끝 표시.
가져오기 "네트워크.한선"모듈 없음 — TCP대기/수락/읽기/쓰기/닫기는
.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)
수정: 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_*
남은 것: 거짓(DATA -1)은 음수 데이터 방출(부호배열 mem[30000+]) 경로라 미추가 — 차기.
비교(크다/작다)가 -1을 직접 생성하므로 실용 영향 적음.
잔여 이슈
- 동시 다중 클라이언트 미지원(단일 루프, 순차 처리). 동시성 필요 시 차기 버전.
- HTTP 경로만 라우팅(메서드 무시). POST/쿼리 파싱은 차기 확장.
- 정통 VM
TCP수락논블로킹 → 무한루프 스택 누적. 블로킹 accept 구현 필요.