2017-09-19 122 views
1

对于我们的任务,当我们运行我们的小机器人时,它会陷入无限循环,我们无法完成它。它所做的就是不断地寻找新的机器人即:Python回声输出不断搜索,但永远不会结束

Waiting for connection... 
Enter command: p2p echo 
Finding another bot... 
Found bot on port 1338 
No bot was listening on port 1338 
Found bot on port 1339 
No bot was listening on port 1339 
Found bot on port 1340 
No bot was listening on port 1340 
Found bot on port 1341 
No bot was listening on port 1341 
Found bot on port 1342 

代码如下

import socket 
import threading 

from lib.comms import StealthConn 
from lib.files import p2p_download_file 

# Keep track of where our server is 
# This is primarily so we don't try to talk to ourselves 
server_port = 1337 

def find_bot(): 
    print("Finding another bot...") 
    port = 1337 
    conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    while 1: 
     if port == server_port: 
      # Don't connect to yourself, silly bot! 
      port += 1 
     else: 
      try: 
       print("Found bot on port %d" % port) 
       conn.connect(("localhost", port)) 
       sconn = StealthConn(conn, client=True) 
       return sconn 
      except socket.error: 
       print("No bot was listening on port %d" % port) 
       port += 1 

def echo_server(sconn): 
    while 1: 
     data = sconn.recv() 
     print("ECHOING>", data) 
     sconn.send(data) 
     if data == b'X' or data == b'exit' or data == b'quit': 
      print("Closing connection...") 
      sconn.close() 
      return 

def accept_connection(conn): 
    try: 
     sconn = StealthConn(conn, server=True) 
     # The sender is either going to chat to us or send a file 
     cmd = sconn.recv() 
     if cmd == b'ECHO': 
      echo_server(sconn) 
     elif cmd == b'FILE': 
      p2p_download_file(sconn) 
    except socket.error: 
     print("Connection closed unexpectedly") 

def bot_server(): 
    global server_port 
    # Every bot is both client & server, so needs to listen for 
    # connections. This is to allow for peer to peer traffic. 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    # Real worms use shifting ports but for simplicity, we won't. 
    # We'll also assume you may run another bot on your computer 
    # so if something else is using 1337, we'll keep going up. 
    while True: 
     try: 
      s.bind(("localhost", server_port)) 
      print("Listening on port %d" % server_port) 
      break 
     except socket.error: 
      # Someone is already using that port -- let's go up one 
      print("Port %d not available" % server_port) 
      server_port += 1 
    s.listen(5) 

    while 1: 
     print("Waiting for connection...") 
     conn, address = s.accept() 
     print("Accepted a connection from %s..." % (address,)) 
     # Start a new thread per connection 
     # We don't need to specify it's a daemon thread as daemon status is inherited 
     threading.Thread(target=accept_connection, args=(conn,)).start() 

左顾右盼,似乎无法找到这样的事情。

回答

0

你试图连接到机器人之前,让您的异常尝试 - 除了

 try: 
      print("Found bot on port %d" % port) 
      conn.connect(("localhost", port)) 
      sconn = StealthConn(conn, client=True) 
      return sconn 
     except socket.error: 
      print("No bot was listening on port %d" % port) 
      port += 1 

您打印出“发现机器人”的一部分。 在print("Found bot on port %d" % port)return sconn之间有个例外。你没有达到那个返回语句,因此是无限循环。 While总是如此。

假设sconn返回一些值,如果你发现一个机器人,你只需要重新排列的东西。

 try: 
      conn.connect(("localhost", port)) 
      sconn = StealthConn(conn, client=True) 
      if sconn: # Check for a return value that makes sense whatever 
         # StealthConn is 
       print("Found bot on port %d" % port) 
       return sconn 
     except socket.error: 
      print("No bot was listening on port %d" % port) 
      port += 1 
相关问题