高校生ハッカーの備忘録

普通の高校生が独学でセキュリティやCTFについて学んでいく備忘録。

サル(高校生)でもわかるPythonでのsocket通信。


※この記事は
「サイバーセキュリティプログラミング〜pythonで学ぶハッカーの思考〜」
という書籍を参考にして書いています。

ずっと欲しかった本を手に入れられて、早速勉強をはじめました。
とてもわかり易く書かれているので、ある程度Pythonを触ったことがある人なら楽に読み進められると思います。


今回のテーマ
pythonTCPサーバーを建ててTCPクライアントとsocket通信する

ますはTCPクライアント。こっちは特に問題なく理解できた

#tcpclient.py
import socket

target_host = "localhost"
target_port = 9999

#ソケットオブジェクトを作成
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#接続
client.connect((target_host,target_port))
#送信
client.send("hogehoge")
#受信
response = client.recv(4096)
#受信したデータを表示
print response

下から3行目のclient.recv()の数字は受信するデータ量を指定します。
ハードウェアやネットワークのシステム上、2の累乗にすべきだそうです。


続いてTCPサーバー。threadingについてほとんど無知だったので理解に時間がかかった。

#tcpserver.py
import socket
import threading

ip_addr = "localhost"
port = 9999

svr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
svr.bind((ip_addr,port))
#接続キューの最大数を指定
svr.listen(2)

print("Listening on %s:%d" % (ip_addr,port))

def handle_client(client_socket):
#クライアントからデータを受信
    req = client_socket.recv(1024)
    print("Received:" + req)
#データの返送
    client_socket.send("Hello World")
#closeを忘れずに!
    client_socket.close()

while True:
    client,addr = svr.accept()
    print("connection from %s:%d" %  (addr[0] , addr[1]))

#Threadの定義・起動
    client_handler = threading.Thread(target = handle_client, args=(client,))
    client_handler.start()

下から五行目socket.accept()は接続を受け付けるソケットオブジェクト。
戻り値が(conn,address)のペアなので、2つの変数に格納する必要がある。
address(addr)は、接続先のアドレス、conn(client)は、接続を通じてデータを送受信するためのソケットオブジェクトを示す。
また、connのデータは関数client_handlerに引数として渡す。(下から二行目)

実行
先にtcpserver.pyを実行した後、tcpclient.pyでいざ通信!

tcpserver.py

$ python tcpserver.py 
Listening on localhost:9999
connection from 127.0.0.1:50700
Received:hogehoge

tcpclient.py

$ python tcpclient.py 
Hello World

問題なく通信できました!
とてもシンプルなコードですが、これをベースに発展させていくようなのでしっかりと理解できてよかったです。
試験勉強しなきゃ...