Python - 我的套接字代码有什么问题
我有一个简单的Python程序,我目前正在开发,由于某种原因,它不起作用。
完整程序的工作方式是它有一个20个端口的列表,然后循环遍历该列表,基本上ping所选端口上的主机。下面的代码:Python - 我的套接字代码有什么问题
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它)然后关闭它。
- 如果它连接它将它写在Ports Scanned下的屏幕上。
- 但是,如果它失败(最近它已经),它会打印在失败的端口扫描下。
当我运行该程序时,它打印Ports Scanned下的列表(80)上的第一个端口,但其余部分置于Failed Port Scan下 - 即使我知道它们至少有一部分已打开。
我怎么会得到这个程序ping比第一个成功的端口更多?
正如@cnicutar的回答中指出的那样,您不能重复使用socket
。但是,在所有情况下,您还应该使用套接字close()
,因为这将释放底层资源。这也可以在api documentation的例子中看到。
当您成功连接到一个端口时,您应该随后调用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
。
您不能重复使用相同的套接字并重新连接。试着每次做一个新的socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_ip, portScan))
即使你close
一个插座,不把它放回它可以重新连接的位置。
难道'接近()'或'关机()'这样做呢? – 2013-03-16 12:16:47
@ user2176286我编辑了我的答案。 'close'不这样做。 – cnicutar 2013-03-16 12:17:57
好的,我看到了编辑。那么shutdown() – 2013-03-16 12:18:57
正如@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()
谢谢!这似乎工作!尽管不要试图追踪谷歌,但它会让它变得糟糕。 – 2013-03-16 12:52:43