2014-12-08 51 views
0

這裏的服務代碼:錯誤的文件描述符socket.recv錯誤及解決方案,但我不知道爲什麼

from socket import * 
from time import ctime 

HOST = '' 
PORT = 21567 
BUFSIZ = 1024 
ADDR = (HOST, PORT) 

tcpSerSock = socket(AF_INET, SOCK_STREAM) 
tcpSerSock.bind(ADDR) 
tcpSerSock.listen(5) 

try: 
    while True: 
     print 'Wait for connection...' 
     tcpCliSock, addr = tcpSerSock.accept() 
     print '...connnet from:', addr 

     while True: 
      data = tcpCliSock.recv(BUFSIZ) 
      if not data: 
       break 
      tcpCliSock.send('[%s] %s' % (ctime(), data)) 
      tcpCliSock.close() 
except (EOFError, KeyboardInterrupt): 
    tcpSerSock.close() 

下面是客戶端代碼:

from socket import * 

HOST = 'localhost' 
PORT = 21567 
BUFSIZ = 1024 
ADDR = (HOST, PORT) 

tcpCliSock = socket(AF_INET, SOCK_STREAM) 
tcpCliSock.connect(ADDR) 

while True: 
    data = raw_input(">") 
    if not data: 
     break 
    tcpCliSock.send(data) 

    data = tcpCliSock.recv(BUFSIZ) 
    if not data: 
     break 
    print data 
    break 

tcpCliSock.close() 

當我運行服務代碼它顯示:

Traceback (most recent call last): 
    File "G:/python/tcpServ&tcpClnt/tsTserv.py", line 22, in <module> 
    data = tcpCliSock.recv(BUFSIZ) 
    File "C:\Python27\lib\socket.py", line 170, in _dummy 
    raise error(EBADF, 'Bad file descriptor') 
socket.error: [Errno 9] Bad file descriptor 

但客戶端仍然可以獲取信息。然後我改變了socket.py中的代碼,它工作正常!但我不知道爲什麼。

PS。我改變:

class _closedsocket(object): 
    __slots__ = [] 
    def _dummy(*args): 
     raise error(EBADF, 'Bad file descriptor') 

這樣:

class _closedsocket(object): 
    __slots__ = [] 
    def _dummy(*args): 
     pass 
+0

檢查你的服務器代碼,HOST ='',爲什麼這裏沒有IP或主機名? – pmverma 2014-12-08 11:59:14

+1

@pmverm空的HOST可以將「bind()」綁定到所有有效地址 – PythonYXY 2014-12-10 08:14:29

回答

0

,因爲你叫前述封閉插座recv()出現的錯誤。執行順序:

 … 
      data = tcpCliSock.recv(BUFSIZ) # data from tcpCliSock.send(data) is received 
# not true: if not data: 
# skipped:  break 
      tcpCliSock.send('[%s] %s' % (ctime(), data)) # reply data is sent to client 
      tcpCliSock.close()        # the socket is closed! 
     while True:           # the loop is reiterated 
      data = tcpCliSock.recv(BUFSIZ)     # the closed socket is used! 

也許你只是錯誤地縮進了tcpCliSock.close()錯誤。如果你減少縮進它,一切工作:

 while True: 
      data = tcpCliSock.recv(BUFSIZ) 
      if not data: 
       break 
      tcpCliSock.send('[%s] %s' % (ctime(), data)) 
     tcpCliSock.close() 

然後我在socket.py改變了代碼,它的工作!但我不知道爲什麼。

通過將raise …更改爲pass,您只是掃描地毯下的錯誤。

相關問題