繁体   English   中英

Python-我的套接字代码出了什么问题

[英]Python - What's wrong with my socket code

我目前正在开发一个简单的Python程序,由于某种原因,它将无法正常工作。
完整程序的工作方式是它具有20个端口的列表,然后遍历该列表,基本上对选定端口上的主机执行ping操作。 这是代码:

import socket
import sys

print '  +-====================================================-+'
print ' /                                                        \ '
print '|                       PyPortScanner                      |'
print '|                       by Ag3ntChr0m                      |'
print ' \                                                        /'
print '  +-====================================================-+'
print ''

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    print 'Failed to create socket. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1]
    sys.exit()
print 'Socket Created'

host = raw_input('Enter the desired host to scan: ')
port = [80, 443, 21, 22, 4567, 8080, 25, 3389, 23, 53, 1723, 110, 135, 445,
        139, 1863, 143, 8081, 10000, 1025]
portFail = []
print 'Scanning top 20 most often open ports ...'

try:
    remote_ip = socket.gethostbyname( host )

except socket.gaierror:
    #couldn't resolve host at port
    print 'Hostname could not be resolved. Program exiting'
    sys.exit()

print 'IP address of ' + host + ' is ' + remote_ip

print '+-===================================-+'
print '| Ports Scanned:----------------------|'
print '+-===================================-+'
print ''

#Connect to remote server
for i in range(0, 20):
    portScan = int(str(port[i]))    <----
    try:

        s.connect((remote_ip, portScan))
        print "\t" + str(portScan)
        s.close()

    except:

        portFail.append(portScan)
        err = True

raw_input('Press Enter to Continue...')

if err:
    print '+-=============================-+'
    print '| Failed Port Scan:-------------|'
    print '+-=============================-+'
    print ''
    size = len(portFail)
    for i in range(1, size):
        print "\t" + str(portFail[i])

当您运行程序时,它应该

  • 将端口号(在箭头标记的行上)加载到s.socket可以用来尝试连接的变量中。
  • 然后,它尝试打开主机上的套接字(基本上是对它进行ping操作),然后将其关闭。
  • 如果连接,则将其写在屏幕的“扫描的端口”下。
  • 但是,如果失败(并且最近发生过),则会在“失败的端口扫描”下进行打印。

当我运行该程序时,它将在“已扫描的端口”下打印列表中的第一个端口(80),但其余端口将放置在“失败的端口扫描”下-即使我至少知道其中一些端口处于打开状态。

我如何让该程序比第一个成功ping更多的端口?

您不能只是重复使用相同的套接字并再次连接。 每次尝试创建一个新的套接字:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_ip, portScan))

即使close插座,也不会将其放回可以重新连接的位置。

如@cnicutar的回答所述,您无法重用socket 但是在所有情况下使用完后,您还应该close()套接字close() socket close() ,因为这将释放底层资源。 这也可以在api文档中的示例中看到。

成功连接到端口后,应随后调用shutdown()以确保其已关闭。

这是代码的相关部分:

for portScan in port:
    try:
        print "scanning: %s" % portScan 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((remote_ip, portScan))
        s.shutdown(socket.SHUT_RDWR)
    except:
        portFail.append(portScan)
        err = True
    finally:
        s.close()

我还自由地简化了循环。

注意:我的实验表明, shutdown()不允许我重复使用socket

正如@cnicutar指出的那样,您不能重用套接字,但是始终可以为每个新连接启动一个新套接字。
您应该使用for循环来扫描端口,例如:

for p2scan in port:
    try:
        print "scanning: %s" % p2scan
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((remote_ip, p2scan))
    except:
        portFail.append(p2scan)
        err = True
    finally:
        s.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM