Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-What';我的套接字代码有问题吗_Python_Sockets_Networking - Fatal编程技术网

Python-What';我的套接字代码有问题吗

Python-What';我的套接字代码有问题吗,python,sockets,networking,Python,Sockets,Networking,我目前正在开发一个简单的Python程序,由于某些原因,它无法工作。 完整程序的工作方式是,它有一个包含20个端口的列表,然后在该列表中循环,基本上在选定端口上ping主机。代码如下: import socket import sys print ' +-====================================================-+' print ' /

我目前正在开发一个简单的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])
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()
导入套接字
导入系统
打印“+-”=================================================================================================-+”
打印“/\”
打印“| PyPortScanner |”
按Ag3ntChr0m打印“|”
打印“\/”
打印“+-”=================================================================================================-+”
打印“
尝试:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
除socket.error外,消息:
“打印”无法创建套接字。错误代码:'+str(消息[0])+'错误消息:'+msg[1]
sys.exit()
打印“已创建套接字”
主机=原始输入('输入要扫描的所需主机:')
端口=[80443,21,224567,8080,253389,23,531723,110135445,
139, 1863, 143, 8081, 10000, 1025]
portFail=[]
打印“扫描前20个最常打开的端口…”
尝试:
远程ip=socket.gethostbyname(主机)
除socket.gai错误外:
#无法解析端口处的主机
无法解析“打印”主机名。程序退出'
sys.exit()
打印“+主机+”的IP地址为“+远程IP”
打印“+-”================================================================-+”
打印“|扫描端口:-------------------------|”
打印“+-”================================================================-+”
打印“
#连接到远程服务器
对于范围(0,20)内的i:

portScan=int(str(port[i]))您不能重复使用同一个套接字并再次连接。每次尝试制作一个新的套接字:

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

即使您
关闭
一个插座,也不会将其放回可以重新连接的位置。

正如@cnicutar的回答所述,您不能重复使用
插座
。但是,在所有情况下使用套接字后都应该
close()
socket,因为这将释放底层资源。这也可以在中的示例中看到

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

以下是守则的相关部分:

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])
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()
不允许我重用
套接字

正如@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()

close()
shutdown()
会这样做吗?@user2176286在你写这篇评论的时候,你可以很容易地测试我发布的内容。我做了,它冻结了空闲和空闲的Python Shell…?谢谢!这似乎有效!尽管不要试图去追赶谷歌,但它会把它冻坏。