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