srudp
1.0.0
このリポジトリは、TCP のように動作するSecure Reliable Data Streamを提供します。
私の目的は、ユーザーがクローズド 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を2台用意します。
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秒に1回helloメッセージを送信します。
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 プロトコルなど、意図しない場合は、async メソッドを使用する必要はありません。
最近では、PC は NAT で保護されたローカル環境に置かれています。 2つの外部間でデータを転送することは困難です。この問題を解決するために、UPnPを使用せずにUDPホールパンチングにより接続を実現します。
UDPはアプリケーションを接続するための最低限の機能を備えたソケットプロトコルです。したがって、接続状態がなく、データに到達できない可能性があり、送信元のなりすましが簡単です。このため、TCP として置き換えることはできません。
このプログラムを使用すると、上記の問題を気にすることなく、TCP と同じように扱うことができます。つまり、接続状態があり、データの到達可能性が保証され、偽造が困難です。
@なむやん
マサチューセッツ工科大学