我尝试使用python套接字发送char 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)
Wireshark捕获: 如何发送字符串然后输入? 使用多个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()
答案 0 :(得分:2)
有序TCP关闭如下所示:
FIN
表示“我没有其他内容可以发送”。ACK
意思是“好的,得到了所有数据”。从这一点开始,从另一侧的套接字读取将返回空(意味着“文件结束”)。FIN
意思是“我没有更多要发送”。ACK
表示“确定,获取所有数据”。但是socket.close
没有按顺序关闭。它发送FIN
,等待ACK
,然后关闭描述符。从这一点来看,任何到此端口的TCP数据包都会产生RST
响应,意味着“没有这样的连接”。
红线只是TCP 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
时才会关闭。