웹소켓 검증카드 — ws/websocket 라이브러리 대응 (파동① "존재≠동작")
개요
크라우니 VM의 WebSocket opcode(780~787, 8종)가 실제로 동작하는지 실측 검증하고,
crowny-rpnkit 라이브러리카드 시리즈(로깅/정규식/직렬화/차트/테스트에 이어) 형태로 대응카드+검증스크립트를 산출했다.
무엇을 했는지
- 인벤토리: 키워드.dat의 WS opcode 8종(301~308줄, WS업그레이드~WS상태) +
hanseonc_high.c(1610~1617줄) 매핑 확인,
crownyc.c(15450~15627줄)에서 실제 구현 확인 — SHA1+Base64 RFC6455 핸드셰이크, 프레임 인코딩/디코딩, 마스킹 해제까지 실제 소켓 I/O 코드(DOM opcode 790~799 같은 스텁이 아님).
pkg/libs/ 웹소켓 관련 16개 파일(웹소켓/웹소켓v2/웹소켓서버/웹소켓앱/게이트웨이웹소켓코어 × 각 .한선/.rpn.한선/.3layer/.rpn.3layer) 확인.- 실측 1차 실패 → 근본원인 추적:
웹소켓v2.한선의 표준 API(소켓생성/소켓바인드/소켓수락)로 만든 소켓을 WS opcode에 넘기면 항상-1실패.
crownyc.c 소스 추적 결과: 소켓생성 계열은 VM 내부 "슬롯" 인덱스를 반환(sock_alloc())하고 sock_get()으로 실제 OS fd 변환이 필요하지만,
WS opcode 780~787은 이 변환 없이 팝된 값을 그대로 raw fd로 send()/recv()/poll()에 사용한다. 반면 TCP대기/TCP수락(opcode 491/492)은 raw fd를 그대로 반환 — 이 경로로 바꾸자 핸드셰이크 101 + 8종 opcode 전부 정상 동작 확인.- 부수 발견:
소켓생성/소켓바인드의 hanseonc_high 빌트인 테이블 arity가 실제 VM opcode(370/371)가 요구하는 인자 개수와 다름(소켓생성 1-arg 선언 vs 2-arg 필요, 소켓바인드 2-arg 선언 vs 3-arg 필요) — 별도 컴파일러 버그로 기록.
WS바이너리(786)는 주석상 "버퍼핸들"을 받는다고 되어 있으나 실제로는 문자열핸들만 허용(str_valid 검사) — 버퍼 전달 시 항상 -1.- 최종 검증: 파이썬 표준 socket/hashlib으로 RFC6455 클라이언트를 직접 구현(외부 websocket 라이브러리 미사용)해
웹소켓검증.sh 최종 실행: PASS=7 FAIL=0 TRAP-CONFIRMED=2, 서버 프로세스/포트 잔류 없음.관련 파일
/Users/ef/crowny-rpnkit/라이브러리카드/웹소켓카드.md— 대응표 + 정본 경로 예제 + 함정 전표(§함정1 슬롯vsRawFd, §함정2 WS바이너리 버퍼불가, §함정3 32KB 캡, §부록A 소켓생성/바인드 arity 버그)/Users/ef/crowny-rpnkit/라이브러리카드/웹소켓검증.sh— 실행 가능 검증 스크립트(재검증:bash 웹소켓검증.sh)/Users/ef/crowny-rpnkit/생성물/ws테스트/*.한선— 조사 과정에서 만든 재현/단위 테스트 스크립트 모음(참고용, 정식 산출물 아님)- 근거 소스:
/Users/ef/CrownyOS/crownyc/crownyc.c:15450-15627(WS opcode 구현),:9814-9860(소켓 슬롯 API),:11820-11874(TCP raw fd API) /Users/ef/CrownyOS/crownyc/hanseonc_high.c:1610-1617(WS 키워드→opcode 테이블),:1390-1399(소켓 계열 arity 선언)
잔여 이슈
소켓생성/소켓바인드arity 불일치는 컴파일러(hanseonc_high.c) 버그 — 별도 수정 필요(이번 세션은 "기존 파일 수정 금지" 지시로 미수정, 발견만 기록).WS바이너리주석("버퍼핸들")과 실제 구현(문자열핸들) 불일치도 미수정.웹소켓v2.한선은 opcode 8종을 올바르게 호출하지만WS서버생성()내부가 슬롯 API를 써서 무력화된 상태 — 라이브러리 자체 패치는 후속 작업.- outbound(클라이언트로서 접속) WS 핸드셰이크는 opcode 미제공(서버측 Upgrade 처리만 존재) — 필요 시 신규 구현 필요.