繁体   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