2017-03-05 60 views
0

我嘗試使用python套接字發送字符Y並輸入後但是當我捕獲wireshark時,我發現它錯誤。爲什麼? 在Python代碼:爲什麼在發送字符串並關閉套接字後出現TCP RST數據包

import socket 
import re 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = (('pwnable.kr', 9009)) 
sock.connect((server_address)) 
b=sock.recv(2048) # I must use 2 sock.recv then recv full text 
print b 
b=sock.recv(2048) 
print b 
b=re.findall("Y/N",b) 
print b 
#sock.recv(1024) 
if b[0]=="Y/N": 
    print "OK" 
    sock.send(("Y"+"\r\n").encode()) 
    b=sock.recv(1024) 

Wireshark的捕獲: enter image description here 如何發送字符串,然後輸入? 使用多個sock.recv影響任何東西?


UPDATE1: 我想打印最近B,它應該是

Enter 1 to Begin the Greatest Game Ever Played. 
Enter 2 to See a Complete Listing of Rules. 
Enter 3 to Exit Game. (Not Recommended) 
Choice: 

但我收到空列表。 我的代碼:

import socket 
import re 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = (('pwnable.kr', 9009)) 
sock.connect((server_address)) 
b=sock.recv(2048) 
print b 
b=sock.recv(2048) 
print b 
b=re.findall("Y/N",b) 
print b 
#sock.recv(1024) 
if b[0]=="Y/N": 
    print "OK" 
    sock.send(("Y"+"\r\n").encode()) 
    b=sock.recv(1024) 
    print b 
sock.close()  

在Wireshark中有紅線: enter image description here

+1

你認爲你得到的錯誤究竟是什麼?那Wireshark捕獲看起來像你的程序做了你想要的。如果問題是''。[2J。[1; 1H''字符串,這些是用於清除屏幕的ANSI控制代碼(Wireshark將字符呈現爲點)。 – jasonharper

+0

而當我使用wireshark,它有1紅色的最後一行,這是錯誤? –

回答

1

這裏發生了什麼?

有序TCP關機看起來是這樣的:

  • 此方發送FIN意思是「我沒有什麼多送」。
  • 另一方迴應ACK這意味着「確定,獲得所有數據」。從這一點,從另一端的套接字讀取將返回空(意思是「文件結束」)。
  • 對方決定無話可說,發送FIN意思是「我什麼也沒發更多」。
  • 這邊發送ACK意思是「好的,得到了​​你所有的數據」。
  • 現在雙方都可以關閉文件描述符。

socket.close沒有按照順序關機。它發送FIN,等待ACK,然後關閉描述符。從這一點來看,任何到這個端口的TCP數據包都會導致一個RST響應,意思是「沒有這樣的連接」。

紅線只是TCP RST數據包的標記。

如何避免RST數據包?

假設遠程端最終關閉空(0字節可用)其recv返回後的連接,您可以通過避免RST:

sock.shutdown(socket.SHUT_WR) 
buf = sock.recv(1) 
if not buf: 
    # Remote side sent FIN. 
    sock.close() 
# else: more data to handle, should recv again, until it returns empty 

這樣你身邊會不會處理所有的事情的另一面要一旦對方說FIN就發送並且關閉。

相關問題