首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -我的套接字代码有什么问题

Python -我的套接字代码有什么问题
EN

Stack Overflow用户
提问于 2013-03-16 12:09:53
回答 3查看 542关注 0票数 0

我有一个简单的Python程序,我目前正在开发,由于某种原因,它不能工作。

整个程序的工作方式是,它有一个由20个端口组成的列表,然后循环遍历该列表,基本上是在所选端口上单击主机。下面是代码:

代码语言:javascript
复制
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)中的第一个端口(80),在端口扫描下,但其余端口会被放置在失败的端口扫描下--尽管我知道其中至少有一些端口是打开的。

我如何使这个程序平比第一个成功的端口更多?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-16 12:42:29

正如@cnicutar的答复中指出的那样,您不能重用socket。但是,在所有情况下使用后,您还应该使用close()套接字,因为这将释放底层资源。这也可以在api文档中找到的例子中看到。

当您成功地连接到一个端口时,您应该随后调用shutdown(),以确保它已关闭。

以下是守则的有关部分:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2013-03-16 12:15:03

您不能仅仅重用同一个套接字并重新连接。每次尝试制作一个新套接字:

代码语言:javascript
复制
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_ip, portScan))

即使您close一个套接字,这也不会使它回到可以重新连接的位置。

票数 1
EN

Stack Overflow用户

发布于 2013-03-16 12:53:20

正如@cnicutar所指出的,您不能重用一个套接字,但是您总是可以为每个新连接启动一个新套接字。

您应该使用for循环扫描端口,如下所示:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15449083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档