2013-03-19 8 views
1

나는 아주 간단한 파이썬 소켓 서버에서 일하고있다. 비 블로킹 소켓을 사용합니다. 서버 및 클라이언트는 Windows 7 x64 (Python 2.7.3)에서 실행됩니다. 여기에 내가 클라이언트에서 데이터를 수신하는 코드입니다 :파이썬 socket.recv 예외

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는 심각한 오류가 아니며 수신 할 데이터가 없을 때 throw됩니다. http://msdn.microsoft.com/en-ca/library/windows/desktop/ms740668(v=vs.85).aspx –