Python 错误的文件描述符socket.recv错误&;解决方案,但我没有';我不知道为什么

Python 错误的文件描述符socket.recv错误&;解决方案,但我没有';我不知道为什么,python,sockets,Python,Sockets,以下是服务代码: 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 connect

以下是服务代码:

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()
当我运行serve代码时,它显示:

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
为此:

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

发生此错误的原因是调用前面关闭的套接字的
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
,您就可以将错误隐藏起来。

检查您的服务器代码,主机='',为什么这里没有IP或主机名?@pmverm空主机可以将“bind()”绑定到所有有效地址
        while True:
            data = tcpCliSock.recv(BUFSIZ)
            if not data:
                break
            tcpCliSock.send('[%s] %s' % (ctime(), data))
        tcpCliSock.close()