2017-09-19 8 views
1

할당을 위해, 우리가 작은 봇을 실행할 때, 그것은 끝없는 루프에 갇혀서 끝나지 않습니다. 주위를 둘러 보았다파이썬 에코 출력은 끊임없이 검색하지만 끝나지 않습니다

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() 

아래

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 

코드과 같은 것을 찾을 수가 없습니다 : 그것은 끊임없이 새로운 봇을 찾아됩니다 않는 모든 즉.

답변

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 사이에 예외가 있습니다. 당신은 그 return statement를 치지 않습니다, 그래서 무한 루프. While은 항상 true입니다.

봇을 찾으면 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