利用Socket编写TCP客户端工具访问网站时接收数据的循环结束标志并不是None而是按照长度
代码比较简单,就是利用socket模块模拟TCP客户端,这里就是模拟浏览器发起对网站的访问,假设socket.recv(1024)所接收的内容长度大于1024字节,那么需要循环接收,那么结束的标志是什么呢?并不是None,而是按照接收到的数据长度来判断是否已经接收完整。
1 import socket 2 import sys 3 import optparse 4 5 class TCPClient: 6 def __init__(self) -> None: 7 self.target = self.get_params()[0] 8 self.port = self.get_params()[1] 9 10 def get_params(self): 11 parser = optparse.OptionParser('Usage: <Program> -t target -p port') 12 parser.add_option('-t', '--target', dest='target', type='string', help='Specify target') 13 parser.add_option('-p', '--port', dest='port', type='int', help='Specify port to connect') 14 options, args = parser.parse_args() 15 if options.target is None or options.port is None: 16 print(parser.usage) 17 sys.exit() 18 return options.target, options.port 19 20 21 def run(self): 22 try: 23 client_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 24 # client_s.settimeout(2) 25 client_s.connect((self.target, self.port)) 26 # print(client_s.recv(4096).decode('utf-8')) 27 send_data = "GET / HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0\r\n\r\n" 28 client_s.send(send_data.encode('utf-8')) 29 recv_data = "" 30 while True: 31 data = client_s.recv(1024).decode('utf-8') 32 if len(data) == 0: 33 break 34 recv_data = recv_data + data 35 print(recv_data) 36 except Exception as e: 37 print(e) 38 sys.exit() 39 40 if __name__ == '__main__': 41 tcpclient = TCPClient() 42 tcpclient.run()
运行结果:
# python tcp_client.py -t 192.168.140.144 -p 80 HTTP/1.1 400 Bad Request Date: Tue, 31 May 2022 09:46:21 GMT Server: Apache/2.2.8 (Ubuntu) DAV/2 Content-Length: 323 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> <hr> <address>Apache/2.2.8 (Ubuntu) DAV/2 Server at metasploitable.localdomain Port 80</address> </body></html>
STRIVE FOR PROGRESS,NOT FOR PERFECTION