I'm trying to understand datagrams. My client program sends a message to the server, and then the server infinitely loops over the recv() to make sure all the data was received. I'm trying to use an * to signal the end of the message, so that the server can break out of the infinite while loop used to check the recv(). However, my server repeatedly outputs the client message over and over again. Can anyone tell me why?
When I start the server, I get the following debug output as expected: --------- debug: start outer while loop #this infinite while loop endlessly listens for messages from the client debug: recv while loop #this infinite while loop checks to make sure the whole message was received ----------- and then the recv() blocks and waits for data to be sent by the client. But when I start the client, the server repeatedly outputs the client message over and over again. My expectation was that after processing the message from the client, the server would block the next time it executed the recv() statement and wait for more data from the client. client: ---------- import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) message = "hello*" #asterisk to delimit end of message msg_size = len(message) total_sent = 0 print "debug:", total_sent, msg_size while total_sent < msg_size: size_sent = s.sendto(message[total_sent:], ("localhost", 7777) ) total_sent += size_sent print "debug:", total_sent, msg_size print 'debug: while loop ended' s.close() ----------- Here's the client output: ------------- debug: 0 6 debug: 6 6 debug: while loop ended --------------- server: ------------------ import socket import sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("", 7777)) try: while True: #This loop listens endlessly for messages. print "debug: start outer while loop" #Receive messages from client: my_list = [] while True: #This loop checks to see if the whole message was received. print "debug: recv while loop" data = s.recv(1024) my_list.append(data) if data.rfind("*"): message = "".join(my_list) print "Received message:\n%s" % message[:-1] break #Send messages back to client: total_sent = 0 while total_sent < len(message): print "debug: send while loop" size_sent = s.sendto(message[total_sent:], ("localhost", 7777) ) total_sent += size_sent print "debug:", total_sent, len(message) finally: s.close() -------------------------- Here's the server output: --------------- debug: start outer while loop debug: recv while loop Received message: hello debug: send while loop debug: 6 6 debug: start outer while loop debug: recv while loop Received message: hello debug: send while loop debug: 6 6 .... .... .... ------------------ -- http://mail.python.org/mailman/listinfo/python-list