2015-03-18 4 views
0

Я хотел создать фрагмент кода, который принимает в 2 списка (1-й список IP-адресов, 2-й список портов). используя итерацию, я попытался достичь соединения (некоторые адреса в списке не работают.) и получить первую страницу HTTP, чтобы проверить, жив или нет адрес.Нет вывода из скрипта python

Это код, который я написал:

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) 

Скрипт работает без ошибок. Проблема в том, что я не получаю выход. Может кто-нибудь выяснить, в чем проблема? Является ли мой цикл for, используя функцию «zip», правильно написан?

+0

Почему вы не используете правильную библиотеку доступа HTTP, как [URLLIB] (https://docs.python.org/2/ library/urllib.html) или, по крайней мере, [httplib] (https://docs.python.org/2/library/httplib.html)? – 9000

+0

Ваша программа никогда не достигает строки «sys.stdout.write (buf)», потому что она застряла в бесконечном цикле while (она также никогда не достигает второго IP-адреса в вашем списке) –

ответ

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) 
+0

Эй, это именно то, что нужно. Благодаря@! – pugilon

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 за указание!

+0

Похож, что 'if not buf' пропускает отступ – wvdz

+0

Правильно! Я сделаю редактирование! – Zizouz212

+0

Эй, спасибо за ответ. Я добавил sys.stdout.flush, но никаких подсказок. О бесконечном цикле я хочу, чтобы он перебирал списки и пытался подключиться, если он не может, он должен просто продолжать следующие элементы в списке. Есть идеи..? – pugilon

Смежные вопросы