srudp
1.0.0
이 저장소는 TCP처럼 작동하는 안전하고 안정적인 데이터 스트림을 제공합니다.
내 목적은 사용자가 폐쇄형 NAT에서 클라이언트 간에 P2P 연결을 생성할 수 있도록 하는 것입니다.
사용자를 위한 튜토리얼 "내 상태로는 작업할 수 없습니다"
pip3 install --user srudp
git clone https://github.com/namuyan/srudp
cd srudp
pip3 install --user -r requirements.txt
python3 -m mypy --config-file=mypy.ini srudp
python3 -m unittest discover
두 대의 독립된 PC를 준비합니다.
from srudp import SecureReliableSocket
from time import sleep , time
sock = SecureReliableSocket ()
sock . connect (( "<remote host 1>" , 12345 ))
while not sock . is_closed :
sock . sendall ( b'hello ' + str ( time ()). encode ())
sleep ( 3 )
print ( "closed" , sock )
A측에서는 3초에 한 번씩 인사 메시지를 보냅니다.
from srudp import SecureReliableSocket
from time import time
sock = SecureReliableSocket ()
sock . connect (( "<remote host 2>" , 12345 ))
while not sock . is_closed :
data = sock . recv ( 1024 )
if not data :
break
print ( time (), data )
print ( "closed" , sock )
상대방은 메시지를 받고 즉시 보여줍니다.
from srudp import SecureReliableSocket
import asyncio
# Get a reference to the current event loop
loop = asyncio . get_event_loop ()
# create a socket
sock = SecureReliableSocket ()
# connect() on another thread because block event loop
address = ( "example.com" , 3000 )
await loop . run_in_executor ( None , sock . connect , ( address ,))
# Register the open socket to wait for data
reader , writer = await asyncio . open_connection ( sock = sock )
# read
data = await reader . read ( 1024 )
# write
writer . write ( b"hello" )
writer . write ( b"world" )
await writer . drain ()
# close
writer . close ()
일반 TCP 소켓처럼 수행할 수 있습니다. 하지만 연결이 많이 필요한 HTTP 프로토콜과 같이 의도하지 않은 경우에는 비동기 방식을 사용할 필요가 없습니다.
요즘 PC는 NAT로 보호되는 로컬 환경에 위치해 있습니다. 두 외부 간에 데이터를 전송하는 것은 어렵습니다. 이 문제를 해결하기 위해 UPnP를 사용하지 않고 UDP 홀 펀칭을 통해 연결을 구현합니다.
UDP는 애플리케이션 연결을 위한 최소한의 기능을 갖춘 소켓 프로토콜입니다. 따라서 연결 상태가 없고 데이터에 접근할 수 없으며 소스를 스푸핑하기 쉽습니다. 이것이 바로 TCP로 대체할 수 없는 이유입니다.
이 프로그램을 사용하면 위의 문제에 대해 걱정하지 않고 TCP처럼 처리할 수 있습니다. 즉, 연결상태를 가지고 있고, 데이터 도달성을 보장하며, 위조가 어렵다.
@나무얀
MIT