pythonでDoIP ~②TCP通信~

DoIP,python,TCP/IP,TCP

今回はDoIPプロトコルの実装に入る前に、pythonでTCP通信を実施する方法について簡単に説明します。

UDPについては以下過去記事を参照。

TCPソケットメソッド

そのうちちゃんとやろうと思いますが、今回は必要最低限のメソッドだけ。

サーバ関連メソッド

メソッド概要
socketTCP用のSocketを作成
bindサーバのIP、Portを設定
listen並列処理可能なキュー設定 (未指定で1)
acceptクライアントからの接続受け入れ
recvデータ受信

クライアント関連メソッド

メソッド概要
socketTCP用のSocketを作成
settimeoutSocketタイムアウトの設定
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プロトコルに取り掛かります。