簡體   English   中英

為什么我的 python 客戶端在從 Internet 接收數據時掛起?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM