2013-03-19 4 views
1

Я работаю над очень простым сервером сокетов python. Я использую неблокирующие сокеты. Сервер и клиент работают на Windows 7 x64 с помощью python 2.7.3. Вот код, где я получаю данные от клиента:Python socket.recv exception

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() 

А вот клиент посылает некоторые данные снова и снова:

#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) 

Я вижу, сервер, принимающий сообщение «тест» над и снова. Но прежде чем он распечатает, что он получил, я получаю следующее сообщение об ошибке.

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

Очевидно исключение выбрасывается в part = s.recv(4096), но почему?

ответ

6

Это именно то, что должен делать неблокирующий сокет.

  • Прочитайте имеющиеся данные, если таковые
  • Если ничего не доступно, возвращения с ошибкой, а не блокирует

Так вы получаете исключение каждый раз, когда вы пытаетесь получить и данных нет.

+1

Обнаружили ошибку в этой ссылке. 10035 не является фатальной ошибкой и бросается, когда нет данных для получения. http://msdn.microsoft.com/en-ca/library/windows/desktop/ms740668(v=vs.85).aspx –

Смежные вопросы