From 92647424324706877cfe73586d633489216de2d2 Mon Sep 17 00:00:00 2001 From: Faris Hasim <farishasimsyauqi@gmail.com> Date: Mon, 22 Nov 2021 12:37:00 +0700 Subject: [PATCH] add segment --- client.py | 11 +++++--- common.py | 8 ++---- segment.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ server.py | 21 ++++++++++----- 4 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 segment.py diff --git a/client.py b/client.py index a3698e6..b4cc65f 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 724d3ea..6c275fe 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 0000000..87ea368 --- /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 8746336..8fc96eb 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): -- GitLab