2

I have server and client code in python in which client sends a request message to server and wait for the response. I have the server code to close the connection when the client doesn't send a proper request. When the server closes the request, the client still is listening forever for the response.

Below is the code

server.py

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
while True:
 c, addr = s.accept()
 # Receive request
 data = c.recv(1024)
 if data != 'something'
 c.close()
 else
 c.sendall("message"+"End")
 c.close()
s.close()

Client.py

End='End'
def recv_end(the_socket):
 # Snippet from http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/
 total_data=[];data=''
 while True:
 data=the_socket.recv(8192)
 if End in data:
 total_data.append(data[:data.find(End)])
 break
 total_data.append(data)
 if len(total_data)>1:
 #check if end_of_data was split
 last_pair=total_data[-2]+total_data[-1]
 if End in last_pair:
 total_data[-2]=last_pair[:last_pair.find(End)]
 total_data.pop()
 break
 return ''.join(total_data)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host, port))
s.send("some_request")
data = s.recv_end(1024)
print "<---- " + str(data)
s.close()

I'm new to python and wondering if there is a way for the client to know that the server closed the connection and terminate.

I understand that the client would disconnect if I use normal s.recv(1024). But in my case, I need to send large data to the client so I have used a different function I found from http://code.activestate.com/recipes/408859-socketrecv-three-ways-to-turn-it-into-recvall/.

Is it like the server sends a empty string reply during the close of a connection and in my case, it would send a empty string without the end limiter and hence the client is listening forever ?

asked Nov 18, 2014 at 13:08
3
  • Does your client hangs in the s.recv(1024) call? Or it returns with an empty response? Commented Nov 18, 2014 at 14:04
  • 1
    I tried your code (after fixing missing : in server) and I cannot reproduce : client displays empty string and exists, and if I modify it to send something, it displays <---- message and exits. Commented Nov 18, 2014 at 14:20
  • @SergeBallesta please check with the edit I made. I'm using a different function to receive with a end limiter because I need to transfer large data. Commented Nov 18, 2014 at 17:09

1 Answer 1

4

When you have a loop with recv or anything that reads from a socket or a pipe, you should stop reading as soon as you get a buffer with len 0 :

while True:
 data=the_socket.recv(8192)
 if len(data) == 0: break
 ...
answered Nov 18, 2014 at 17:15
Sign up to request clarification or add additional context in comments.

3 Comments

So, on close, the server sends a empty response? And that is the only way the client will know that the connection is closed?
Not exactly. But when a socket is closed on the peer, the read on the other side is aborted and returns 0 bytes. It's the same logic as an eof when reading from a true file.
Someday the docs will reflect this..

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.