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
Branches
No related merge requests found
......@@ -67,6 +67,64 @@ class Client():
def recv_file(self):
# 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
def close_con(self):
......@@ -75,7 +133,7 @@ class Client():
byte, _ = self.recv()
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
seg = Segment(300, rcvd.get_seq_no())
seg.setACK()
......@@ -89,10 +147,11 @@ class Client():
byte, _ = self.recv()
rcvd = Segment().from_bytes(byte)
if (not rcvd.test_checksum) or (not rcvd.getACK) \
or (not rcvd.get_ack_no != seg.get_seq_no):
if (not rcvd.test_checksum()) or (not rcvd.getACK()) \
or (rcvd.get_ack_no() != seg.get_seq_no()):
raise ConnectionError
log(f"Segment SEQ={seg.get_seq_no()}, FIN", "Acked")
# self.socket.close()
return
if __name__=="__main__":
......
......@@ -5,7 +5,7 @@ from common import *
class Server():
def __init__(self, port=10000, filepath="input"):
def __init__(self, port=10000, filepath="data/halo.txt"):
self.SERVER_PORT = port
self.FILE_PATH = filepath
self.clients = []
......@@ -14,7 +14,7 @@ class Server():
self.listen()
for client in self.clients :
self.handshake(client)
self.send_file(client)
# self.send_file(client)
self.close_con(client)
def init_socket(self):
......@@ -23,7 +23,10 @@ class Server():
self.socket.bind((HOST_NAME, self.SERVER_PORT))
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):
return self.socket.recvfrom(SEG_SIZE)
......@@ -81,7 +84,7 @@ class Server():
def send_file(self, client_addr):
# 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:
file = f.read()
......@@ -94,6 +97,8 @@ class Server():
self.send(self.FILE_PATH + f"-{file_size}", client_addr)
log("!", "File path and size sent")
print()
return True
def close_con(self, client_addr):
......@@ -126,6 +131,6 @@ class Server():
if __name__=="__main__":
try:
Server(port=sys.argv[1]);
Server(port=sys.argv[1], filepath=sys.argv[2]);
except:
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