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プロトコルに取り掛かります。

 https://telecom-engineer.blog/python-dns-3/
 https://telecom-engineer.blog/python-dns-3/