의
local rset = {socket}
... later
...select(rset, nil, 0)
: 그 옵션이 아니라면, 대신 일시적으로 사람의 정적 테이블을 읽고 전달하는 데 필요하지 않은 목록에 대한 select()
대신 {}
에 nil
을 통과 고려 이 문제를 다룰 수있는 다양한 방법이 있습니다. 어느 쪽을 선택 하느냐하는 것은 당신이하고 싶은 일의 양에 달려 있습니다. *
그러나 먼저 UDP 또는 TCP를 다루고 있는지 명확히해야합니다. UDP 소켓에는 "기본 TCP 스택"이 없습니다. 또한 UDP는 텍스트 나 사진과 같은 전체 데이터를 전송하는 데 사용하는 잘못된 프로토콜입니다. 그것은 신뢰할 수없는 프로토콜이므로 관리되는 소켓 라이브러리 (예 : ENet)를 사용하지 않는 한 모든 패킷을받을 수 있다고 보장 할 수 없습니다.
Lua51/LuaJIT + LuaSocket
폴링이 유일한 방법이다.
- 블로킹 : 시간 인수가없는
socket.select
을 호출하고 소켓을 읽을 수있을 때까지 기다립니다.
- 비 블로킹 :
0
의 시간 종료 인수를 사용하여 socket.select
을 호출하고 읽고있는 소켓에서 sock:settimeout(0)
을 사용하십시오.
다음을 반복적으로 호출하십시오. 비 차단 버전으로 coroutine scheduler을 사용하여 프로그램의 다른 부분을 너무 오래 지연시키지 않고 계속 실행할 수 있도록하는 것이 좋습니다.
Lua51/LuaJIT + LuaSocket + Lua Lanes 위의 방법으로
동일 (권장)하지만, 소켓이 다른 차선 (다른 스레드에서 경량 루아 상태)에 존재 Lua Lanes (latest source)를 사용했다. 이렇게하면 소켓에서 버퍼로 즉시 데이터를 읽을 수 있습니다. 그런 다음 linda을 사용하여 메인 스레드로 데이터를 보내 처리합니다.
아마도이 문제가 가장 좋은 해결책 일 수 있습니다.
간단한 예제를 만들었습니다. here을 사용할 수 있습니다. 그것은 루아 레인 3.4.0 (GitHub repo) 및 패치 LuaSocket 2.0.2 (source, patch, blog post re' patch)
당신이 그것에서 파생하는 경우 당신은 확실히 내 예제 코드를 리팩토링해야하지만 결과는, 유망한에 의존한다. 조금 자학 경우
LuaJIT + OS 별 소켓
, 당신은 처음부터 소켓 라이브러리를 구현하는 시도 할 수 있습니다. LuaJIT의 FFI library은 순수 루아에서 가능합니다. 루아 레인 (Lua Lanes)도 이와 같이 유용 할 것입니다.
Windows의 경우 William Adam's blog을 살펴 보시기 바랍니다. 그는 LuaJIT 및 Windows 개발에 대한 흥미로운 모험을 경험했습니다. Linux와 나머지 부분에서는 C 또는 LuaSocket 소스에 대한 자습서를보고 LuaJIT FFI 작업으로 변환하십시오.
합니다 (API가 필요한 경우 LuaJIT가 callbacks을 지원하지만, signficant 성능 비용 루아에서 C와 폴링에 비해이)
LuaJIT + ENET
ENet 좋은 라이브러리입니다. 그것은 TCP와 UDP 사이의 완벽한 믹스를 제공합니다 : 원하는 경우 신뢰할 수 있고 그렇지 않은 경우에는 신뢰할 수 없습니다. 또한 LuaSocket과 마찬가지로 운영 체제 관련 세부 사항을 추상화합니다. Lua API를 사용하여 바인딩하거나 LuaJIT의 FFI를 통해 직접 액세스 할 수 있습니다 (권장).
* 우연한 사람.
루아가 실제로 콜백을 사용하는 시스템 이벤트가있는 단일 스레드 시스템이라는 것을 알고 있습니다. 나는 계속해서 그것을 보지 않고 사용할 수있는 데이터가있을 때 전화를받을 수 있기를 바랬다. – user4749
콜백 수신을 위해 콜백을 수행하고 있던 사람이라면 컨트롤을 전송해야합니다. 그래서 당신이 그랬을 때마다 데이터가 있는지 확인하십시오. –
나는 크게 동의하지 않습니다. lua-ev 또는 다른 이벤트를 사용하면 폴링이 부과되지 않습니다!Lua + 사용 "일부 이벤트 루프"는 매우 우수한 성능과 낮은 메모리 사용량으로 심각한 작업을 위해 임베디드 장치 (node.js가 큰 위치)에서 매우 생산적으로 사용됩니다. 어떤 상황에서는 완벽한 일치입니다. 매우 낮은 수준 (https://github.com/justincormack/ljsyscall)의 OS로 작업하기가 매우 쉬운 모듈이 있습니다. – lipp