diff --git a/client.py b/client.py index a3698e65c6be2928d324c5e86ee876636027753d..b4cc65f57e6ec77d7bbfea9b5f079412e49af455 100644 --- a/client.py +++ b/client.py @@ -33,13 +33,16 @@ class Client(): def broadcast(self): self.send(bytes(), (HOST_ADDRESS, BROADCAST_PORT)) log("!", "Message sent to broadcast address") - - data, address = self.recv() - log("!", data) - log("!", f"Server address : {address}") def handshake(self): # To-Do + data, address = self.recv() + log("!", f"Server address : {address}") + + seg = Segment() + seg.from_bytes(data) + log("!", seg.bytes[:100]) + return def recv_file(self): diff --git a/common.py b/common.py index 724d3ea9e8d835cd157cdc825d93d305ffa09723..6c275fe584a8a65b2c16eb0bbe8da217c4b6eb52 100644 --- a/common.py +++ b/common.py @@ -1,4 +1,5 @@ import socket +from segment import * ################ ### CONSTANT ### @@ -6,15 +7,10 @@ import socket BROADCAST_PORT = 9999 HOST_NAME = socket.gethostname() HOST_ADDRESS = socket.gethostbyname(HOST_NAME) -SEG_SIZE = 32768 +SEG_SIZE = 32782 ################ ### FUNCTION ### ################ def log(context:str, info:str, end:str=None): print(f"[{context}] {info}", end=end) - -def cheksum(data:bytes): - # To Change - return data[0] - \ No newline at end of file diff --git a/segment.py b/segment.py new file mode 100644 index 0000000000000000000000000000000000000000..87ea3686497fa53124d96f46b8b194e23222c482 --- /dev/null +++ b/segment.py @@ -0,0 +1,78 @@ +# constant +SEG_SIZE = 32782 +DATA_SIZE = SEG_SIZE - 12 + +class Segment(): + + def __init__(self): + self.bytes = [0 for _ in range(SEG_SIZE)] + + def set_seq_no(self, val): + self.bytes[0] = val >> 24 & 0xff + self.bytes[1] = val >> 16 & 0xff + self.bytes[2] = val >> 8 & 0xff + self.bytes[3] = val & 0xff + + def get_seq_no(self): + return self.bytes[0] << 24 + \ + self.bytes[1] << 16 + \ + self.bytes[2] << 8 + \ + self.bytes[3] + + def set_seq_no(self, val): + self.bytes[4] = val >> 24 & 0xff + self.bytes[5] = val >> 16 & 0xff + self.bytes[6] = val >> 8 & 0xff + self.bytes[7] = val & 0xff + + def get_seq_no(self): + return self.bytes[4] << 24 + \ + self.bytes[5] << 16 + \ + self.bytes[6] << 8 + \ + self.bytes[7] + + def setSYN(self): + # raise SYN flag + self.bytes[8] = self.bytes[8] | 0b01000000 + + def getSYN(self): + return self.bytes[8] & 0b01000000 + + def setACK(self): + # raise ACK flag + self.bytes[8] = self.bytes[8] | 0b00001000 + + def getACK(self): + return self.bytes[8] & 0b00001000 + + def setFIN(self): + # raise FIN flag + self.bytes[8] = self.bytes[8] | 0b10000000 + + def getFIN(self): + return self.bytes[8] & 0b10000000 + + def get_checksum(self): + return self.bytes[10] << 8 + self.bytes[11] + + def set_checksum(self, val): + self.bytes[10] = val >> 8 & 0xff + self.bytes[11] = val & 0xff + + def count_checksum(self): + # To-Do + # ... + return + + def to_bytes(self): + return bytes(self.bytes) + + def from_bytes(self, byte:bytes): + self.bytes = list(byte) + +if __name__=="__main__": + seg = Segment() + + seg.setFIN() + + print(seg.bytes[:100]) diff --git a/server.py b/server.py index 8746336a34f4fff1cc1d2b0455b9ace0d0752683..8fc96ebf2aecb25910f59fc92e50c13c1828f518 100644 --- a/server.py +++ b/server.py @@ -2,10 +2,6 @@ import socket import sys from common import * -# def CONSTANT -SERVER_PORT = 10000 # default -MSG = "Welcome to the server" - class Server(): def __init__(self, port=10000, filepath="input"): @@ -23,6 +19,7 @@ class Server(): def init_socket(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.socket.bind((HOST_NAME, self.SERVER_PORT)) def send(self, data, client_addr): self.socket.sendto(data, client_addr) @@ -30,14 +27,20 @@ class Server(): def recv(self): return self.socket.recvfrom(SEG_SIZE) + def recv_broadcast(self): + return self.broadcast_socket.recvfrom(SEG_SIZE) + def listen(self): - self.socket.bind((HOST_NAME, BROADCAST_PORT)) + # init broadcast socket for listening broadcast message + self.broadcast_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.broadcast_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.broadcast_socket.bind((HOST_NAME, BROADCAST_PORT)) log("!", f"Server listening on broadcast address\n") while True: - message, address = self.recv() + message, address = self.recv_broadcast() log("!", f"Client {address} found") - self.send(bytes(), address) # <-- To-change + # self.send(bytes(), address) # <-- To-change self.clients.append(address) log("?", "Listen more? (y/n) ", end="") @@ -47,6 +50,10 @@ class Server(): def handshake(self, client_addr): # To-DO + segment = Segment() + segment.setSYN() + self.send(segment.to_bytes(), client_addr) + return def send_file(self, client_addr):