Skip to content
Snippets Groups Projects
Commit 3145799e authored by Faris Hasim Syauqi's avatar Faris Hasim Syauqi
Browse files

Merge & fix bug

parents c91eaf27 533d6d87
No related merge requests found
...@@ -67,6 +67,64 @@ class Client(): ...@@ -67,6 +67,64 @@ class Client():
def recv_file(self): def recv_file(self):
# To-Do # To-Do
rcvd = Segment()
base = 0 # antrian ngirim data
data_ret = b''
log("!", f"Waiting for server to send data")
while True:
data, server_addr = self.recv() # nerima data dari server
file_received = self.FILEPATH # deklarasi buat tempat penyimpanan berkas
rcvd.from_bytes(data) # unwrap the data
if rcvd.test_checksum() and rcvd.get_seq_no == base: # untuk ngecek valid checksumnya dan memastikan ini urutan awal
if rcvd.isData(): # check jika segmennya bertipe data
ack_segment = Segment()
ack_segment.setACK()
ack_segment.set_seq_no(0)
ack_segment.set_ack_no(rcvd.get_seq_no+1)
self.send(ack_segment.to_bytes(), server_addr)
log(f"Segment SEQ={rcvd.get_seq_no()}: Received {rcvd.isData()}, Sent {ack_segment.getACK()}")
data_ret += ack_segment.get_data()
else:
log(f"Data is empty")
base += 1
elif rcvd.getFIN():
finack_segment = Segment()
finack_segment.set_seq_no(0)
finack_segment.set_ack_no(0)
finack_segment.setFIN()
finack_segment.setACK()
self.send(finack_segment.to_bytes(), server_addr)
break
elif not rcvd.test_checksum() or rcvd.get_seq_no() > base:
refuse_segment = Segment()
refuse_segment.set_seq_no(0)
refuse_segment.set_ack_no(base)
refuse_segment.setSYN()
self.send(refuse_segment.to_bytes(), server_addr)
log("!", f"WARNING!!! Segment refused")
elif rcvd.get_seq_no < base:
ack_segment = Segment()
ack_segment.set_seq_no(0)
ack_segment.set_ack_no(base)
ack_segment.getACK()
self.send(ack_segment.to_bytes(), server_addr)
log("!", f"WARNING!!! Segment already received")
# ini mau void apa mau return data_ret yakk wkwkkwkwkwkwk
return return
def close_con(self): def close_con(self):
...@@ -75,7 +133,7 @@ class Client(): ...@@ -75,7 +133,7 @@ class Client():
byte, _ = self.recv() byte, _ = self.recv()
rcvd = Segment().from_bytes(byte) rcvd = Segment().from_bytes(byte)
if (not rcvd.test_checksum) or (not rcvd.getFIN): if (not rcvd.test_checksum()) or (not rcvd.getFIN()):
raise ConnectionError raise ConnectionError
seg = Segment(300, rcvd.get_seq_no()) seg = Segment(300, rcvd.get_seq_no())
seg.setACK() seg.setACK()
...@@ -89,10 +147,11 @@ class Client(): ...@@ -89,10 +147,11 @@ class Client():
byte, _ = self.recv() byte, _ = self.recv()
rcvd = Segment().from_bytes(byte) rcvd = Segment().from_bytes(byte)
if (not rcvd.test_checksum) or (not rcvd.getACK) \ if (not rcvd.test_checksum()) or (not rcvd.getACK()) \
or (not rcvd.get_ack_no != seg.get_seq_no): or (rcvd.get_ack_no() != seg.get_seq_no()):
raise ConnectionError raise ConnectionError
log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked") log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked")
# self.socket.close()
return return
if __name__=="__main__": if __name__=="__main__":
......
...@@ -5,7 +5,7 @@ from common import * ...@@ -5,7 +5,7 @@ from common import *
class Server(): class Server():
def __init__(self, port=10000, filepath="input"): def __init__(self, port=10000, filepath="data/halo.txt"):
self.SERVER_PORT = port self.SERVER_PORT = port
self.FILE_PATH = filepath self.FILE_PATH = filepath
self.clients = [] self.clients = []
...@@ -14,7 +14,7 @@ class Server(): ...@@ -14,7 +14,7 @@ class Server():
self.listen() self.listen()
for client in self.clients : for client in self.clients :
self.handshake(client) self.handshake(client)
self.send_file(client) # self.send_file(client)
self.close_con(client) self.close_con(client)
def init_socket(self): def init_socket(self):
...@@ -23,7 +23,10 @@ class Server(): ...@@ -23,7 +23,10 @@ class Server():
self.socket.bind((HOST_NAME, self.SERVER_PORT)) self.socket.bind((HOST_NAME, self.SERVER_PORT))
def send(self, data, client_addr): def send(self, data, client_addr):
self.socket.sendto(data, client_addr) if(type(data) == str):
self.socket.sendto(str.encode(data), client_addr)
else:
self.socket.sendto(data, client_addr)
def recv(self): def recv(self):
return self.socket.recvfrom(SEG_SIZE) return self.socket.recvfrom(SEG_SIZE)
...@@ -81,7 +84,7 @@ class Server(): ...@@ -81,7 +84,7 @@ class Server():
def send_file(self, client_addr): def send_file(self, client_addr):
# To-Do # To-Do
file_size = os.path.getSize(self.FILE_PATH) file_size = os.path.getsize(self.FILE_PATH)
with open(self.FILE_PATH, "rb") as f: with open(self.FILE_PATH, "rb") as f:
file = f.read() file = f.read()
...@@ -94,6 +97,8 @@ class Server(): ...@@ -94,6 +97,8 @@ class Server():
self.send(self.FILE_PATH + f"-{file_size}", client_addr) self.send(self.FILE_PATH + f"-{file_size}", client_addr)
log("!", "File path and size sent") log("!", "File path and size sent")
print()
return True return True
def close_con(self, client_addr): def close_con(self, client_addr):
...@@ -126,6 +131,6 @@ class Server(): ...@@ -126,6 +131,6 @@ class Server():
if __name__=="__main__": if __name__=="__main__":
try: try:
Server(port=sys.argv[1]); Server(port=sys.argv[1], filepath=sys.argv[2]);
except: except:
Server(); Server();
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment