当出现cannot send after transport endpoint shutdown的报错时,主要原因是对一个已经关闭的socket进行写操作,因为socket已经被关闭,所以系统无法发送数据。
解决办法:
-
确认程序中是否已正常关闭相关socket,如果没有关闭应该在适当的时候关闭。
-
检查程序逻辑,避免在socket的写操作中出现异常操作。
-
确认系统内核版本是否正确,有些内核版本中出现类似问题。
示例说明:
以下是一个简单的python示例代码:
import socket
address = ('127.0.0.1', 8000)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
data = "hello"
s.send(data.encode())
s.shutdown(socket.SHUT_RDWR)
s.send(data.encode()) # 报错 cannot send after transport endpoint shutdown
s.close()
在以上代码中,我们向一个已关闭的socket发送数据,就会出现cannot send after transport endpoint shutdown的报错。
可以通过在shutdown之前检查socket状态来避免以上错误:
import socket
address = ('127.0.0.1', 8000)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
data = "hello"
s.send(data.encode())
if s.fileno() != -1: # 检查socket状态
s.shutdown(socket.SHUT_RDWR)
s.send(data.encode()) # 报错 cannot send after transport endpoint shutdown
s.close()
在以上代码中,我们在shutdown之前检查socket状态,如果socket正常则进行shutdown操作,否则直接关闭即可。