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