2017-02-05 24 views
0

私はPythonでTCPクライアントを作成しています。これは、サーバーに接続して回答するときにサーバーから数学的な問題が発生する必要があります。 私はNetcatを使用してサーバーに接続し、Wiresharkの上でこれを見た: enter image description herePython TCPclientは認識しません

私は私のコードでそれをやったとき、私は唯一の違いは、サーバーの後に私のコードはdoesnの質問を送ることで、この enter image description here

を見ましたそれに対するACKはありません。ここで

は私のコードです:

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = 'x.x.x.x' 
port = 1337 
s.connect((host, port)) 

while 1: 
    data = s.recv(1024) 
    print(data) 
    splited_data = data.splitlines() 
    exercise = splited_data[-1].decode("utf-8") 
    print(exercise) 
    exercise = splited_data[-1].split() 
    num1 = int(exercise[0]) 
    arithmetic = exercise[1].decode("utf-8") 
    num2 = int(exercise[2]) 

    if arithmetic == '+': 
     answer = num1 + num2 
    elif arithmetic == '-': 
     answer = num1 - num2 
    elif arithmetic == '*': 
     answer = num1 * num2 
    elif arithmetic == '/': 
     answer = num1/num2 
    elif arithmetic == '%': 
     answer = num1 % num2 
    else: 
     print(arithmetic) 

    print(answer) 
    print(str(answer).encode('utf-8')) 
    s.send(str(answer).encode('utf-8')) 

答えて

0

サーバーがメッセージの中に、これらの問題をカプセル化するために使用し、あなたのコードは、このようなメッセージを受信するためには対応するコードを持っていないものは何でもプロトコル。サーバーが使用しているプロトコルのマニュアルに従うか、プロトコルが文書化されていない場合は、それをリバースエンジニアリングする必要があります。

TCPは、アプリケーションメッセージの境界を保持しないバイトストリームプロトコルです。メッセージを実装するには、メッセージレイヤーを作成する必要があります。あなたはそのようなコードを書いていません。

2つのプログラムがメッセージを交換するたびに、それらのメッセージの開始と終了がどのようにマークされ、識別されるかについていくつかの合意が必要です。送信者は、メッセージの最後を同意したものとしてマークするコードを持っていなければなりません。受信者は、メッセージの終わりを見つけるためのコードを持っていなければなりません。あなたのレシーバーはそのようなコードを持っていないので、メッセージがどこで終わるかを正確に把握することはできません。

+0

しかし、netcatでどうやってメッセージを送受信でき、私のpythonクライアントで私は傾けることができますか? AFAIK ACKは、socket.recvを実行すると自動的に送信されます。 –

+0

@ YonatanKreinerサーバーが使用しているプロトコルがわからないと、どのように失敗するかを正確に説明できません。しかし、全くプロトコルを実装していないので、間違いなく失敗します。 (サーバーがあなたの質問に使用しているプロトコルの詳細を追加できるので、私の答えを改善することができますか?) –

+0

私はそれを持っていません、そのCTF私はちょうどNetcatで行うのと同じようにTCPでデータを送受信する必要があります。 –

0

whileループの後ろでs.close()を使用して接続を終了します。

最初のWiresharkスニペットでは、一方の側でTCP接続を適切にシャットダウンできないように見えます。

+0

ええ、私は知っているが、これは私が遭遇する問題ではない。私はこの問題を解決した後にソケットを閉じます –

関連する問題