Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
338 views
in Technique[技术] by (71.8m points)

python TCP socket blocks on recv method

i am currently trying to go through a basic tutorial on networking and i noticed that a rudimentary client/server program would freeze upon the server trying to read more data from the client when all the data is received . Basically the code looks like this :

def recv_all(sock,length):
    data=''
    while len(data)<length:
        more=sock.recv(length-len(data))
        if not more :
            raise EOFError('socket inchis %d octeti intr-un mesaj de %d octeti'%(len(data),length))
        data+=more
    return data

This function is called from both client and server but the server will use it first to process the client request. All goes fine until the second call to sock.recv , when the request message has been received.

Instead of jumping to the next line (with more being 0) the debugger just freezes there and i have no idea what the reason for that might be.

My OS is Windows XP if this is relevant in any way. Any help would be appreciated, Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

As others have pointed out, the cause is the fact that sockets are blocking by default. It means that the recv function will block the execution of the program until some data arrive. Unless things are changed, the program will wait forever, or until the server breaks the connection.

One solution is to switch to non-blocking sockets, using the settimeout function, like this sock.settimeout(2). This means that if nothing is received within 2 seconds, an exception will be thrown. You can catch that exception and handle it accordingly.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...