2017-09-19 194 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 
相關問題