Python 为什么发送字符串并关闭套接字后会出现TCP RST数据包
我尝试使用python套接字发送字符Y和回车后的字符,但当我捕获wireshark时,我检测到它出错。为什么? python中的代码:Python 为什么发送字符串并关闭套接字后会出现TCP RST数据包,python,sockets,Python,Sockets,我尝试使用python套接字发送字符Y和回车后的字符,但当我捕获wireshark时,我检测到它出错。为什么? python中的代码: 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
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)
线鲨捕获:
如何发送字符串,然后输入?
使用多个sock.recv会影响什么
更新1: 我想打印最后一张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()
在这条红线中:
这里发生了什么?
TCP有序关闭如下所示:
- 这一方发送
意味着“我没有更多的东西要发送”FIN
- 另一方响应
意思是“好的,获取了所有数据”。从这一点开始,从另一侧的套接字读取将返回空(表示“文件结束”)ACK
- 另一方认为它没有更多的话要说,发送
,意思是“我没有更多的东西要发送”FIN
- 此端发送
表示“好的,获取所有数据”ACK
- 现在,双方都可以关闭文件描述符
socket.close
不能有序关闭。它发送FIN
,等待ACK
,然后关闭描述符。从这一点开始,任何到这个端口的TCP数据包都将导致一个RST
响应,意思是“没有这样的连接”
红线只是TCPRST
数据包的标记
如何避免RST数据包?
假设远程端在其recv
返回空(0字节可用)后最终关闭连接,您可以通过执行以下操作来避免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
时才会关闭 你认为你的错误到底是什么?Wireshark的捕获看起来像是你的程序完全按照你的要求完成了。如果问题是[2J.[1;1H
字符串,那么这些是清除屏幕的ANSI控制代码(Wireshark将字符渲染为点)。当我使用Wireshark时,它的最后一行是红色的,这是错误吗?