2017-02-05 4 views
0

Я пишу TCP-клиент в python, который должен получить математические проблемы с сервера, когда он подключается к нему и отвечает на них. Я подключен к серверу с Netcat и видел это на Wireshark: enter image description herePython TCPclient не признает

Когда я сделал это с моим кодом я видел этот enter image description here

Единственное отличие в том, что после того, как сервер отправляет вопрос мой код Безразлично «АСК к нему.

Вот мой код:

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 - это протокол потока байтов, который не сохраняет границы сообщений приложения. Для реализации сообщений вам необходимо написать слой сообщения. Вы не написали такой код.

Всякий раз, когда две программы собираются обмениваться сообщениями, они должны иметь некоторое согласие относительно того, как обозначаются и идентифицируются начало и конец этих сообщений. Отправитель должен иметь код для обозначения конца сообщений по согласованию. У приемника должен быть код, чтобы найти конец сообщений. У вашего приемника нет такого кода, поэтому он не может достоверно определить, где заканчиваются сообщения.

+0

но как это с netcat я могу отправлять и получать сообщения и с моим клиентом python я не могу? AFAIK ACK отправляется автоматически, когда вы делаете socket.recv –

+0

@YonatanKreiner Не зная протокола, который использует сервер, я не могу точно объяснить, как он терпит неудачу. Но это, безусловно, потерпит неудачу, поскольку он вообще не использует протокол. (Можете ли вы добавить сведения о протоколе, который сервер использует для вашего вопроса, чтобы я мог улучшить свой ответ?) –

+0

У меня его нет, его CTF мне просто нужно отправлять и получать данные по TCP, как я делаю с Netcat –

0

Я бы использовал s.close() за вашим циклом while, чтобы завершить ваше соединение.

В вашем первом фрагменте Wireshark это выглядит так, что одна сторона не может нормально закрыть TCP-соединение.

+0

Да, я знаю, но это не проблема, с которой я сталкиваюсь. Я закрою сокет после исправления этой проблемы –

Смежные вопросы