pythonでDoIP ~②TCP通信~
今回はDoIPプロトコルの実装に入る前に、pythonでTCP通信を実施する方法について簡単に説明します。
UDPについては以下過去記事を参照。
Contents
TCPソケットメソッド
そのうちちゃんとやろうと思いますが、今回は必要最低限のメソッドだけ。
サーバ関連メソッド
メソッド | 概要 |
---|---|
socket | TCP用のSocketを作成 |
bind | サーバのIP、Portを設定 |
listen | 並列処理可能なキュー設定 (未指定で1) |
accept | クライアントからの接続受け入れ |
recv | データ受信 |
クライアント関連メソッド
メソッド | 概要 |
---|---|
socket | TCP用のSocketを作成 |
settimeout | Socketタイムアウトの設定 |
bind | クライアントのIP、Portを設定 |
connect | サーバへの接続要求 |
send | データ送信 |
recv | データ受信 |
close | コネクションの終了 |
ソース
簡単な送受信を実施するテストコードになります。
サーバ
受信後は"responce"を応答します。
import socket
import time
BUFFER_SIZE = 1024
def tcp_recv( ip_addr , port ):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(( ip_addr , port))
s.listen()
time.sleep(1)
while True:
time.sleep(1)
(connection, client) = s.accept()
try:
print('Client connected', client)
data = connection.recv(BUFFER_SIZE)
print(data.hex())
connection.send("responce".encode('utf-8'))
finally:
print('close', client)
break
if __name__ == '__main__':
tcp_recv( "127.0.0.1" , 50000 )
クライアント
データ送信後は受信処理を実施。
from socket import socket, AF_INET, SOCK_STREAM
def tcp_connect( src_ip , dst_ip , src_port , dst_port ):
global tcpClntSock
# ソケット作成
tcpClntSock = socket(AF_INET, SOCK_STREAM)
tcpClntSock.settimeout(0.5)
# 送信側アドレスをtupleに格納
SrcAddr = ( src_ip , src_port )
# 送信側アドレスでソケットを設定
tcpClntSock.bind(SrcAddr)
# サーバーに接続
tcpClntSock.connect((dst_ip, dst_port))
def tcp_send( data ):
global tcpClntSock
try:
tcpClntSock.send(data.encode('utf-8'))
response = tcpClntSock.recv(4096)
print(response)
except ConnectionResetError:
# ソケットクローズ
tcpClntSock.close()
return
def tcp_close():
global tcpClntSock
# ソケットクローズ
tcpClntSock.close()
print("TCP切断",tcpClntSock)
if __name__ == '__main__':
tcp_connect( "127.0.0.1" , "127.0.0.1" , 13402 , 50000 )
tcp_send( "Hello" )
tcp_close()
処理結果
コマンドプロンプト
サーバ
クライアント
wireshark
ローカルの通信をwiresharkで確認してみました。
IPアドレス変えた方がわかりやすかったですね。
一応ポート番号から、2者間でちゃんと3ウェイシェイクハンドをして接続、4ウェイシェイクハンドで切断していることが分かります。
最後に
簡単ですがTCP通信ができるようになりました。
次回からはいよいよDoIPプロトコルに取り掛かります。