크라우니 리모트 v1 — Mac-to-Mac 8+8 다중화면 원격제어
9개 맥스튜디오 × 9 CLI MAX200 계정 × 9명 작업자. 동일 블록체인 작업폴더. remote.crowny.org (포트 9701).
무엇을 만들었나
100% 한선씨 백엔드 + Mac 네이티브 시각화 보조. 사용자의 "안정성 우선" 명시에 따라 한선씨 한계 부분만 C/Swift 동반 + 한선씨 동반 파일 강제.
컴포넌트 (전부 빌드 성공, E2E 테스트 통과)
| 컴포넌트 | 언어 | 파일 | 포트 | 상태 |
|---|---|---|---|---|
| 등록/인증/시그널링 서버 | 한선씨 | server/리모트서버.한선 (7042 큐브) | 9701 | ✅ E2E |
| 에이전트 (상대맥) | 한선씨 | agent/리모트에이전트.한선 (6623 큐브) | 9711 | ✅ E2E |
| 화면 캡처 | bash + screencapture | agent/캡처.sh | — | ✅ JPG 16KB |
| PTY 데몬 | C (forkpty + zsh) | pty/pty_bridge.c (34KB) | 9710 | ✅ |
| PTY 한선씨 동반 | 한선씨 | pty/pty_bridge.한선 | — | ✅ |
| 한선씨 클라이언트 CLI | 한선씨 | viewer/리모트클라이언트.한선 | — | ✅ |
| Mac 뷰어 (8+8 16분할) | Swift+SwiftUI | viewer/RemoteViewer.swift (223KB 바이너리) | — | ✅ 빌드 |
| 뷰어 한선씨 동반 | 한선씨 | viewer/RemoteViewer.한선 (4728 큐브) | — | ✅ |
와이어 프로토콜 (안정성을 위해 영문 키 + ASCII 헤더)
+-- 8자 16진수 길이 + \n -+ +---- N 바이트 UTF-8 ASCII JSON ----+
| | | |
- 헤더 항상
0x00~0x7F→ 한선씨글자수≠ 바이너리 바이트 수 문제 회피 - 본문 키는 영문 (
t/dev/pw/pwh/tk/dst/ch/n/d/key/out/data/...) - 한선씨 식별자(변수/함수)는 한글 유지 — 와이어만 영문
메시지 종류
| t | 의미 | 흐름 |
|---|---|---|
reg / reg_ok | 디바이스 등록 | 클라이언트 → 서버 |
login / token | 로그인 → 토큰 발급 (30분) | 클라이언트 → 서버 |
conn / conn_ok | 시그널링 (대상 디바이스 매칭) | 관제 → 서버 |
hello / hello_ok | 토큰 확인 | 관제 → 에이전트 |
cap / scrn | 화면 캡처 요청 → Base64 JPG | 관제 → 에이전트 |
inp / out | 명령 실행 (V1: zsh -c) | 관제 → 에이전트 |
ping / pong | 헬스체크 | — |
err | 오류 | — |
E2E 테스트 결과
[1] ping : {"t":"pong","ts":1779857819}
[2] reg : {"t":"reg_ok","dev":"CR-CROWNY-01"}
[3] login: {"t":"token","tk":"a2364dd3...","exp":1779859619}
[4] bad : {"t":"err","msg":"bad_token"} ← 잘못된 토큰 거부
[5] hello: {"t":"hello_ok","ts":1779857819}
[6] inp : t=out data_len=37
out: CROWNY-OK
/Users/ef/CrownyOS/crownyc
[7] cap : fmt=jpg b64chars=16383 ← JPEG magic ffd8ffe0 검증
발견한 한선씨 함정 (이번 작업에서 새로 잡음)
- 자연반올림 나눗셈 → hex 변환 망가짐:
값 / 16의 나머지가 [-8, +8] 범위.값 % 16또는값 - (값/16)*16결과가 음수 시부분(_hex문자, 음수)→ 헤더 1자리 누락 → 본문 잘림.
q = 값/16; r = 값 - q*16; 만약 r<0: r+=16, q-=1
- 학습 등록: 프레임헤더_hex8_프레이밍- 글자수 ≠ 바이트수 (한글 UTF-8): 헤더 4바이트 빅엔디안 + 한글 본문 사용 시 클라이언트가 짧게 받음. 해결: 모든 헤더/본문 ASCII로 강제.
소켓연결반환값 변동: 음수 체크 분기로 빠짐. 해결: 체크 생략 후 사용 (실패 시 다음 send/recv에서 발현).
- 함수명 숫자 시작 금지:
정수16진→정수hex로 재명명 (토큰 분리).
시도는 예외처리 예약어 — 변수명 불가.회차로 대체.
소켓받기인터랙티브 폴링 빈 응답: 같은 프로세스 내 TCP 서버 listen + TCP 클라이언트 connect 혼용 시 NIO 동작이 OS 버퍼와 동기 안 맞음. V1은 일회성체계("zsh -c ... > file")우회. 진짜 PTY 세션 모드는 V2.
안정성 결정 (사용자 명시 반영)
"한선씨/크라우니 기계어로 작성하고 싶은데 제한되는 게 있으면 이 프로그램은 특별히 더 안정적인 것으로 제작. 맥과 맥끼리의 작업도구이니까."
- 백엔드/프로토콜/인증 → 100% 한선씨 (정통)
- 화면 캡처 →
screencapture(Mac 네이티브 CLI) - PTY → C 작은 래퍼 (forkpty + zsh + 양방향 펌프)
- 뷰어 시각화/단축키 → SwiftUI (NSImage 라이브 렌더 안정성)
- 모든 비-한선씨 코드는 같은 로직의
.한선동반 파일 작성 — 학습DB에 정통이 학습됨
컴퓨터 ID 체계 (법인 통합계정 컨셉)
CR-법인코드-노드번호(예:CR-CROWNY-01~CR-CROWNY-09)- 사용자 개인 ID와 별개 — 작업 컴퓨터의 ID
- 비밀번호는 SHA256 해시로만 서버에 저장
- 세션 토큰 30분 TTL, 모든 후속 요청에 첨부
실행 (5단계)
bash# 1. 빌드
/Users/ef/crowny-remote/scripts/빌드.sh
# 2. 서버 (remote.crowny.org 매핑)
/Users/ef/CrownyOS/crownyc/crownyc run /Users/ef/crowny-remote/server/리모트서버.toau &
# 3. PTY 데몬 (각 상대맥에서)
/Users/ef/crowny-remote/pty/pty_bridge 9710 &
# 4. 에이전트 (각 상대맥에서) — 미리 토큰파일 생성
echo "<토큰>" > /Users/ef/crowny-remote/agent/토큰.txt
/Users/ef/CrownyOS/crownyc/crownyc run /Users/ef/crowny-remote/agent/리모트에이전트.toau &
# 5. 관제 뷰어 (내 맥)
/Users/ef/crowny-remote/viewer/RemoteViewer
단축키 (뷰어)
- Ctrl+1~9 → 좌측 8 (내 작업화면) 활성 전환
- Ctrl+Shift+1~9 → 우측 8 (상대 작업화면) 활성 전환
- 마우스 클릭 → 활성 패널 변경
- 하단 입력창 + Enter → 활성 패널의 에이전트로 명령 전송
다음 단계 (V2)
- 진짜 PTY 세션 모드 (inp_pty) — 인터랙티브 셸(vim/ssh/htop). 한선씨
소켓받기폴링 한계 회피 위해 작은 Cpty_callhelper 추가 검토. - AES 채널 암호화 — AES.한선 통합 (현재 SHA256 해시만 사용)
- 9명 동시 접속 부하 테스트 — 한선씨 서버 멀티 클라이언트 수락 루프 fork/select 패턴
- NAT 통과 / 릴레이 모드 — LAN 외부에서도 동작 (서버가 양방향 채널 릴레이)
- Xcode 프로젝트로 뷰어 정식화 — 현재는 단일 swiftc 빌드
관련 파일
/Users/ef/crowny-remote/
├── server/
│ ├── 리모트서버.한선 (한선씨 정본)
│ ├── 디바이스.dat (등록 영속화)
│ └── 세션.dat
├── agent/
│ ├── 리모트에이전트.한선
│ └── 캡처.sh
├── pty/
│ ├── pty_bridge.c (C 래퍼)
│ └── pty_bridge.한선 (한선씨 동반)
├── viewer/
│ ├── RemoteViewer.swift (SwiftUI 16분할)
│ ├── RemoteViewer.한선 (한선씨 동반 데모)
│ └── 리모트클라이언트.한선 (한선씨 CLI)
├── docs/
│ ├── 설계.md
│ └── 와이어프로토콜.md
└── scripts/
└── 빌드.sh
게이트웨이 등록 (자동)
crowny-ports.sh set 으로 3개 서비스 자동 등록됨:
remote.crowny.org→ :9701 (서버)remote-agent.crowny.org→ :9711 (LAN 내부)remote-pty.crowny.org→ :9710 (localhost 전용)