This repository was archived by the owner on Jun 14, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsockets.py
More file actions
93 lines (78 loc) · 2.59 KB
/
sockets.py
File metadata and controls
93 lines (78 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import socket
import argparse
import signal
import sys
import threading
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - [%(levelname)s] - %(message)s')
logger = logging.getLogger(__name__)
ok = True
def write_data(socket):
while ok:
data = sys.stdin.readline()
if not data:
break
socket.send(data.encode('utf-8'))
def read_data(socket):
while ok:
data = socket.recv(4096)
if not data:
break
sys.stdout.write(data.decode('utf-8'))
sys.stdout.flush()
def run_server(host, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
reader = None
client_socket = None
try:
server.bind((host, port))
server.listen(5)
logger.info(f"Listening on {host}:{port}")
client_socket, _ = server.accept()
logger.info(f"Accepted connection from {client_socket.getpeername()[0]}:{client_socket.getpeername()[1]}")
reader = threading.Thread(target=read_data, args=(client_socket,))
writer = threading.Thread(target=write_data, args=(client_socket,))
reader.start()
writer.start()
except Exception as e:
logger.error(f"{e}")
finally:
if reader:
reader.join()
if client_socket != None:
client_socket.close()
server.close()
def run_client(host, port):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
reader = None
try:
client.connect((host, port))
logger.info(f"Connected to {host}:{port}")
writer = threading.Thread(target=write_data, args=(client,))
reader = threading.Thread(target=read_data, args=(client,))
writer.start()
reader.start()
except Exception as e:
logger.error(f"{e}")
finally:
if reader != None:
reader.join()
client.close()
def terminar(signal, frame):
logger.info("Connection terminated: EOF")
global ok
ok = False
sys.exit(0)
def main():
parser = argparse.ArgumentParser(description='Simple Netcat-like Python Script')
parser.add_argument('-l', '--listen', action='store_true', help='Listen mode')
parser.add_argument('-p', '--port', type=int, default=8080, help='Port to connect or bind to')
parser.add_argument('-H', '--host', default='localhost', help='Host to connect to')
args = parser.parse_args()
signal.signal(signal.SIGINT, terminar)
if args.listen:
run_server(args.host, args.port)
else:
run_client(args.host, args.port)
if __name__ == '__main__':
main()