Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python socket.recv exception

I'm working on a very simple python socket server. I use non-blocking sockets. The server and client are running on windows 7 x64 with python 2.7.3. Here is the code where I receive data from the client :

def listenToSockets(self):

    while True:

        changed_sockets = self.currentSockets

        ready_to_read, ready_to_write, in_error = select.select(changed_sockets,[],[])

        for s in ready_to_read:
            # if its the server master socket someone is connecting
            if s == self.socket:
                (client_socket, address) = s.accept()
                print "putting " + address[0] + " onto connections\n";
                client_socket.setblocking(0)

                self.currentSockets.append(client_socket)
                print "current client count : " + str(len(self.currentSockets) - 1)

            else:

                data = ''
                try:

                    while True:
                        part = s.recv(4096)
                        if part != '':
                            data = data + part
                        elif part == '':
                            break


                except socket.error, (value,message): 
                    print 'socket.error - ' + message


                if data != '':
                    print "server received "+data
                else:
                    print "Disconnected "+str(s.getsockname())

                    self.currentSockets.remove(s)
                    s.close()

And here is the client sending some data over and over again :

#client example
import socket
import time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.0.41', 9999))


while 1:
    client_socket.send("test")
    time.sleep(2) 

I see the server receiving the message "test" over and over again. But before it prints out what it received I get the following error message.

socket.error - A non-blocking socket operation could not be completed immediately.

Obviously an exception is thrown at part = s.recv(4096) but why?

like image 209
Barış Uşaklı Avatar asked Mar 19 '13 19:03

Barış Uşaklı


1 Answers

That's precisely what a nonblocking socket is supposed to do.

  • Read the available data, if any
  • If nothing is available, raise an error rather than blocking

So you're getting an exception every time you try to receive and there's no data available.

like image 142
cnicutar Avatar answered Nov 18 '22 22:11

cnicutar