![](/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.