Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么发送字符串并关闭套接字后会出现TCP RST数据包_Python_Sockets - Fatal编程技术网

Python 为什么发送字符串并关闭套接字后会出现TCP RST数据包

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

我尝试使用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 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
响应,意思是“没有这样的连接”

红线只是TCP
RST
数据包的标记

如何避免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时,它的最后一行是红色的,这是错误吗?