2017-02-05 1 views
0

저는 파이썬에서 연결하고 대답 할 때 서버로부터 수학 문제를 가져와야하는 TCP 클라이언트를 작성하고 있습니다. 내가 netcat을 사용하여 서버에 연결 와이어 샤크에 이것을보고 : 내 코드로했을 때 나는 서버가 질문을 전송 한 후 유일한 차이점은 내 코드 아무튼되는이 enter image description herePython TCPclient 인정 안 함

을 보았다 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는 응용 프로그램 메시지 경계를 보존하지 않는 바이트 스트림 프로토콜입니다. 메시지를 구현하려면 메시지 계층을 작성해야합니다. 귀하는 그러한 코드를 작성하지 않았습니다.

두 프로그램이 메시지를 교환 할 때마다 메시지의 시작과 끝이 어떻게 표시되고 식별되는지에 대해 합의해야합니다. 보낸 사람은 메시지의 끝을 동의 한대로 표시하는 코드가 있어야합니다. 수신자는 메시지의 끝을 찾는 코드가 있어야합니다. 수신기에는 그러한 코드가 없으므로 메시지가 끝나는 위치를 안정적으로 파악할 수 없습니다.

+0

하지만 netcat을 사용하여 메시지를 보내고받을 수있는 방법은 무엇입니까? AFAIK ACK는 socket.recv를 할 때 자동으로 전송됩니다. –

+0

@ YonatanKreiner 서버가 사용하는 프로토콜을 모르면 어떻게 실패하는지 정확하게 설명 할 수 없습니다. 그러나 전혀 프로토콜을 구현하지 않으므로 확실히 실패 할 것입니다. (당신이 내 대답을 향상시킬 수 있도록 귀하의 질문에 사용하는 프로토콜의 세부 정보를 추가 할 수 있습니까?) –

+0

그 CTF 난 그냥 TCP를 통해 데이터를 보내고받을 필요가 Netcat 함께 할 –

0

while 루프 뒤에 s.close()를 사용하여 연결을 종료합니다.

첫 번째 Wireshark 스 니펫에서는 한쪽에서 TCP 연결을 제대로 종료 할 수없는 것처럼 보입니다.

+0

그래, 알아,하지만이게 내가 만나는 문제는 아니야. 이 문제를 해결 한 후에 소켓을 닫습니다. –