I am creating a simple messaging server and client in Python using the socket library. First I am doing some validation and a key exchange before I let the user send messages. Every once and a while I get an issue where the server will send a message and the client won’t receive it and then the server will move on trying to receive a message, but the client is still blocking on the receive call too so they are in a deadlock. I am confused how this is happening because I thought the socket API ran TCP which should be guaranteed delivery.
This is part of the server side:
def serverSocket():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('0.0.0.0', 2048))
s.listen()
conn, addr = s.accept()
print("Connected by {}".format(addr))
with conn:
## Start Diffie-Hellman
# generate a list of primes
primes = primesSieve()
# pick g
g = pickPrime(500, primes)
# send g
printDebug("Sending g")
conn.send(bytes(str(g), 'utf-8'))
printDebug("Sent g")
# pick p
p = pickPrime(500, primes, g)
# send p
printDebug("Sending p")
conn.send(bytes(str(p), 'utf-8'))
printDebug("Sent p")
# pick a
a = random.randint(500, 2000)
# calculate A
A = (g**a)%p
# send A
printDebug("Sending A")
conn.send(bytes(str(A), 'utf-8'))
printDebug("Sent A")
# receive B
printDebug("Receiving B")
data = conn.recv(1024) #### This is where the server will stop
printDebug("Received B")
# convert B TODO error checking
B = int(data.decode('utf-8'))
# evaluate key
key = (B**a)%p
This is part of the client side:
def clientSocket():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(('0.0.0.0', 2048))
## Start Diffie-Hellman
# receive g
printDebug("Receiving g")
g = s.recv(1024).decode('utf-8')
printDebug("Received g")
g = int(g)
# receive p
printDebug("Receiving p")
p = s.recv(1024).decode('utf-8')
printDebug("Received p")
p = int(p)
# receive A
printDebug("Receiving A")
data = s.recv(1024) #### This is where the client will stop
printDebug("Received A")
# convert A TODO error checking
A = int(data.decode('utf-8'))
# pick b
b = random.randint(500, 2000)
printDebug(b)
B = (g ** b) % p
printDebug(B)
# send B
printDebug("Sending B")
s.send(bytes(str(B), 'utf-8'))
printDebug("Sent B")
# evaluate key
key = (A ** b) % p
Most of the time this works flawlessly. However sometimes when the client side is trying to receive A the server sends it then moves on to receiving B, but the client never receives A and doesn’t move on.
Thank you for any help. Also I know this really isn’t the best way to do Diffie Hellman and that the numbers are not large enough.
Advertisement
Answer
As @user207421 said in his comment I was already reading them because it was getting more than one message.