注册

Linux报 “cannot send after transport endpoint shutdown” 异常的原因以及解决办法

当出现cannot send after transport endpoint shutdown的报错时,主要原因是对一个已经关闭的socket进行写操作,因为socket已经被关闭,所以系统无法发送数据。

解决办法:

  1. 确认程序中是否已正常关闭相关socket,如果没有关闭应该在适当的时候关闭。

  2. 检查程序逻辑,避免在socket的写操作中出现异常操作。

  3. 确认系统内核版本是否正确,有些内核版本中出现类似问题。

示例说明:

以下是一个简单的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操作,否则直接关闭即可。