TCP 기초
연결하고 데이터를 보내 보세요.
TCP 기초은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
LuaSocket이란 무엇인가
LuaSocket은 Lua의 사실상 표준 네트워킹 라이브러리입니다. 원시 TCP 및 UDP 소켓과 HTTP, SMTP, FTP를 위한 상위 수준 도우미를 제공합니다.
이는 외부 C 모듈이므로 기본 Lua에 포함되어 있지 않습니다. LuaRocks를 통해 설치하고 require로 불러옵니다.
이 과정의 코드 조각은 네트워크에 연결하므로 일반적인 실행 환경에서는 실행되지 않습니다.
local socket = require("socket")
print(socket._VERSION)TCP 소켓 만들기
핵심 객체는 socket.tcp()로 만드는 TCP 마스터 소켓입니다. 새로 만든 마스터는 연결되지 않았고 바인딩되지 않은 상태입니다.
마스터에서 connect하여 클라이언트 객체로 전환하거나, bind+listen하여 서버 객체로 전환할 수 있습니다.
대부분의 호출은 값 하나를 반환하거나, 오류 문자열과 함께 nil을 반환하므로 항상 두 값을 모두 받아야 합니다.
local socket = require("socket")
local tcp, err = socket.tcp()
if not tcp then error(err) end주소 체계
TCP는 IPv4 또는 IPv6를 통해 작동합니다. socket.tcp()는 주소 체계를 지연해서 선택하고, socket.tcp4()와 socket.tcp6()는 각각 하나를 강제로 선택합니다.
명시적으로 제어해야 한다면 연결하기 전에 socket.dns.toip(host)를 사용하여 호스트 이름을 숫자 주소로 변환하십시오.
local socket = require("socket")
local ip, info = socket.dns.toip("example.com")
print(ip)호스트에 연결하기
conn:connect(host, port)는 TCP의 세 방향 핸드셰이크를 수행합니다. 성공하면 1을 반환하고, 실패하면 nil과 "connection refused" 또는 "timeout" 같은 오류 메시지를 반환합니다.
편의 함수 socket.connect(host, port)를 사용하면 소켓을 만들고 한 번에 연결할 수 있습니다.
local socket = require("socket")
local conn, err = socket.connect("example.com", 80)
if not conn then print("failed:", err) end데이터 보내기
conn:send(data)는 소켓에 바이트를 씁니다. 전송된 마지막 바이트의 인덱스를 반환합니다. 블로킹 소켓에서는 일반적으로 data의 전체 길이에 해당합니다.
TCP는 메시지 프로토콜이 아니라 바이트 스트림이므로 하나의 send가 네트워크를 통해 여러 부분으로 나뉘거나 합쳐질 수 있습니다. 메시지의 경계를 직접 정해야 합니다.
local request = "GET / HTTP/1.0\r\n\r\n"
local sent, err = conn:send(request)
print("bytes sent:", sent)데이터 받기
conn:receive(pattern)은 스트림에서 데이터를 읽습니다. 기본 패턴인 "*l"은 줄바꿈을 제외한 한 줄을 읽습니다. "*a"는 연결이 닫힐 때까지 읽습니다.
숫자를 전달하여 정확히 그만큼의 바이트를 읽을 수도 있습니다. 오류가 발생하면 nil, 오류 문자열, 그리고 수신된 일부 데이터를 반환합니다.
local line, err = conn:receive("*l")
local chunk = conn:receive(512)
local all = conn:receive("*a")연결 닫기
작업이 끝나면 항상 conn:close()를 호출하여 파일 디스크립터를 해제하고 TCP FIN을 보내십시오.
conn:shutdown("send")를 사용하여 반쯤 닫을 수도 있습니다. 그러면 상대편의 응답은 계속 읽으면서 스트림이 끝났음을 알릴 수 있습니다. 이는 "*a"를 사용하는 요청/응답 프로토콜에 유용합니다.
conn:shutdown("send")
local reply = conn:receive("*a")
conn:close()시간 제한의 중요성
기본적으로 소켓은 영원히 블로킹됩니다. conn:settimeout(seconds)은 호출이 기다리는 시간을 제한합니다. 0으로 설정하면 소켓이 논블로킹 방식으로 작동합니다.
시간 제한이 발생하면 호출은 nil과 "timeout" 문자열을 반환합니다. 운영 환경에서는 연결이 멈춘 채로 대기하지 않도록 항상 시간 제한을 설정하십시오.
conn:settimeout(5)
local data, err = conn:receive("*l")
if err == "timeout" then print("too slow") endTCP와 UDP 비교
TCP는 연결 지향적이고 순서가 보장되며 신뢰성이 높습니다. 즉, 바이트가 한 번씩 순서대로 도착하지만, 그 대가로 연결 설정과 재전송이 필요합니다.
UDP(socket.udp())는 연결이 없고 신뢰성이 낮지만 가벼워 원격 측정이나 게임에 적합합니다. 이 과정에서는 HTTP의 기반이 되는 TCP에 집중합니다.
부분 전송과 반복문
비차단 소켓에서는 send가 버퍼의 일부만 전송할 수 있습니다. nil, "timeout", 그리고 지금까지 기록된 마지막 바이트의 인덱스를 반환합니다.
견고한 송신자는 반복문을 사용해 마지막으로 전송한 바이트의 다음 바이트부터 재개하며, 전체 버퍼가 전송될 때까지 반복합니다.
local i = 1
while i <= #data do
local sent, err, last = conn:send(data, i)
i = (sent or last) + 1
if err and err ~= "timeout" then break end
end연결 살펴보기
conn:getpeername()은 원격 IP와 포트를 반환하고, conn:getsockname()은 로컬 끝점을 반환합니다. 이를 활용하면 로깅과 디버깅을 수행할 수 있습니다.
conn:setoption("keepalive", true)와 conn:setoption("tcp-nodelay", true)를 사용하면 기반 소켓의 동작을 조정할 수 있습니다.
local ip, port = conn:getpeername()
print("connected to", ip, port)
conn:setoption("tcp-nodelay", true)빠른 확인
TCP 수신 동작을 제대로 이해했는지 확인해 보십시오.
복습
LuaSocket의 TCP 마스터 객체를 살펴보고, 소켓을 생성하고 연결하고 송수신하고 닫는 방법을 배웠으며, 시간 제한과 반쪽 닫기가 동작에 어떤 영향을 주는지 확인했습니다.
TCP는 바이트 스트림이며 모든 호출이 nil, err을 반환할 수 있고, 운영 환경의 소켓은 항상 시간 제한을 설정해야 한다는 점을 기억하십시오. 다음에는 이 요소들을 조합해 작동하는 클라이언트를 만들어 보겠습니다.
자주 묻는 질문
“TCP 기초” 강의는 무료인가요?
네 — “TCP 기초” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“TCP 기초”에서 뭘 배우나요?
연결하고 데이터를 보내 보세요. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“TCP 기초” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.