套接字无法建立连接

时间:2016-12-28 16:14:58

标签: python sockets network-programming broken-pipe

我尝试使用横幅抓取来编写python中的端口扫描程序。

没有s.send('getBanner\n')行(抓取横幅)我的脚本工作,它打印开放的端口。

但是当我添加'getBanner'行时,套接字错误显示为'[Errn 32] Broken Pipe'

我知道可能会发生此错误,因为客户端不会等到连接建立并关闭套接字。我怎么解决这个问题?

代码:

import socket

host = '192.168.1.1'

for port in range(1,1024):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = s.connect_ex((host, port))
        s.send(('getBanner\n'))
        banner = s.recv(1024)
        if result == 0:
                print "[+] Port %s tcp/open" % port
                print "[+] Banner: %s" % banner
        s.close()

1 个答案:

答案 0 :(得分:1)

并非所有端口都有监听它们的服务,当它们执行时,您需要遵循该服务的任何正常协议。我假设你有一些响应“getBanner”的服务,但大多数不会。您正在连接到FTP,SSH,DNS,NFS和邮件服务器之类的东西,而这些东西没有“getBanner”命令。但是您也尝试连接到没有任何内容监听的端口,这会产生错误。

查看文档:

connect_ex(...)
    connect_ex(address) -> errno

    This is like connect(address), but returns an error code (the errno value)
    instead of raising an exception when an error occurs.

您的连接调用返回错误代码,您需要在尝试发送请求之前检查它。所以,至少:

import socket

host = '192.168.1.1'

for port in range(1,1024):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = s.connect_ex((host, port))
        if result == 0:
            s.send(('getBanner\n'))
            banner = s.recv(1024)
            if result == 0:
                    print "[+] Port %s tcp/open" % port
                    print "[+] Banner: %s" % banner
        s.close()

但是,由于大多数侦听端口的服务器都不响应“getBanner”命令,因此它要么挂起,要么更可能引发连接重置错误。