没有python脚本的输出

时间:2015-03-18 13:02:20

标签: python sockets http

我想创建一段代码,其中包含2个列表(第一个是IP列表,第二个是端口列表)。使用迭代,我试图实现连接(列表中的某些地址不起作用。)并获取第一个HTTP页面,以检查地址是活还是死。

这是我写的代码:

import socket
import sys

ipees = []
portees = []

text_file = open("/home/loggyipport.txt", "r")
lines = text_file.readlines()

def go():
    for x in lines:
        ip, port = x.split()
        ipees.append(ip)
        portees.append(port)




go()

def dfunc(ipees, portees):
    for (ip, port) in zip(ipees, portees):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ip, int(port)))
        s.send('GET / HTTP/1.0\r\n\r\n')
        while 1:
            buf = s.recv(1000)
        if not buf:
            break
        sys.stdout.write(buf)
        s.close()

dfunc(ipees, portees)

脚本正在运行,没有任何错误。 问题是我没有输出。 有人能弄清楚问题是什么吗? 使用'zip'函数的for循环是否正确写入?

2 个答案:

答案 0 :(得分:1)

您不会在功能中退回任何内容,也不会在控制台上打印任何内容。您执行此操作的唯一时间是dfunc(ipees, portees),其中您有sys.stdout.write(buf)。尝试添加sys.stdout.flush以刷新缓冲区并打印到屏幕上。

sys.stdout.write(buf)
sys.stdout.flush()

实际上,我可能会发现另外一个问题。脚本是否会终止? while中有一个无限dfunc个循环。

while 1:
    buf = s.recv(1000)

我对socket.socket一无所知,但看起来这个循环永远不会终止。

 if not buf:
     break

不是你的循环的一部分。你必须修复缩进,所以它成为你的循环的一部分。感谢popovitsj指出它!

答案 1 :(得分:1)

在你的dfunc函数中,程序成功连接到第一个IP,并且由于无限循环而无限地等待来自服务器的数据。如果您只想检查从服务器收到的数据,则根本不需要while循环。

这是一个可能做你想要的功能:

def dfunc(ipees, portees):
    for (ip, port) in zip(ipees, portees):
        try:
            s = socket.create_connection((ip, port), timeout=10)
            s.send('GET / HTTP/1.0\r\n\r\n')
            buf = s.recv(1000)
            print buf
        except socket.error:
            print 'Could not connect to ({0}, {1})'.format(ip, port)