我正试着用python做一个简单的端口扫描器,但是它似乎在recv期间挂起了,默认超时引发了一个异常并终止了程序。
import socket, argparse
parser = argparse.ArgumentParser(description="A Port scanner",
usage="command -w <website> -p <port>",
prog="Port Scanner")
parser.add_argument("-w", nargs=1, type=str, required=True, dest="site",
help="The website to scan")
parser.add_argument("-p", nargs=1, type=int, dest="port",
help="The port to scan", default=80)
namespace = parser.parse_args()
def connect(host: str, port:int) -> bool:
ip = socket.gethostbyname(host)
socket.setdefaulttimeout(10)
conn_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
conn_sock.connect((ip, port))
except:
print("[+] port {} is closed".format(port))
return False
else:
print("[+] Port {} is open".format(port))
conn_sock.sendall(b"HTTP GET /")
response = conn_sock.recv(100)
print("[+] Got 100 bytes as {}".format(response))
return True
connect(namespace.site[0], namespace.port[0])以prog -w www.google.com -p 80身份运行(也在不同的网站上尝试过),它显示端口80已按预期打开并连接,而且发送数据似乎也不会造成任何问题。Trackback是
response = conn_sock.recv(100)
socket.timeout: timed out发布于 2021-01-13 13:42:31
服务器没有响应,因为您没有向它发送完整或有效的请求。尝试:
conn_sock.sendall(b"HTTP GET /\r\n\r\n")在(可选)头和(可选)正文之间需要有一个空行。您不需要设置任何头部,因此您只需要在请求的末尾添加两个CRLF。这将使您能够与服务器进行通信。
但是您应该将您的请求更改为:
GET / HTTP/1.1\r\n\r\n 如果您想要获得有效的HTTP/1.1 200 OK响应。
https://stackoverflow.com/questions/65696169
复制相似问题