![](/img/trans.png)
[英]python Client hangs when no data to receive from server and hangs in that thread w/o letting client send
[英]Why my python client hangs when recieving data from internet?
我正在尝试使用 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 已打开并连接,因为假设也发送数据似乎不会引起任何问题。 引用是
response = conn_sock.recv(100)
socket.timeout: timed out
服务器没有响应,因为您没有向它发送完整或有效的请求。 尝试:
conn_sock.sendall(b"HTTP GET /\r\n\r\n")
(可选)标题和(可选)正文之间需要一个空行。 您没有设置任何标头,因此您只需要在请求结束时使用两个 CRLF。 这将使您与服务器通信。
但是您应该将您的请求更改为:
GET / HTTP/1.1\r\n\r\n
如果您想获得有效的HTTP/1.1 200 OK
响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.