我想创建一段代码,其中包含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循环是否正确写入?
答案 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)