套接字:send() 函数返回“Broken Pipe”错误

4

我初次接触socket编程,我想使用C++中的send()函数向服务器发送一些数据包,但在发送数据包时总是出现“Broken pipe”错误。您能帮我解决以下问题吗?

  1. send()函数返回“Broken pipe”错误的情况是什么?
  2. socket编程中“Broken pipe”错误的原因是什么?
  3. 如何解决send()函数引起的“Broken pipe”错误?

注:我正在使用命名套接字进行客户端和服务器之间的通信。

2个回答

8
  1. send()返回“Broken pipe”错误时

当您向已被对等方关闭的连接写入数据时。

  1. 套接字编程中“Broken pipe”错误的原因是什么?

向已被对等方关闭的连接写入数据。

  1. 如何解决send()函数返回的“Broken pipe”错误?

不要向已被对等方关闭的连接写入数据。

通常这意味着您已经发生了应用程序协议错误,因此对等方无法理解您并放弃了连接。


谢谢您的回复,那么什么时候会出现“Bad file Descriptor”的错误? - K.H.Nagaradder
@K.H.Nagaradder - 大多数套接字发送错误(除了EAGAIN和EWOULDBLOCK)都应视为连接失败,您的代码应该只关闭套接字句柄。如果您收到“坏文件描述符”,那么可能意味着您的编程出现了错误。比如说,您可能已经关闭了套接字或者您正在发送的文件句柄不是套接字。 - selbie
@K.H.Nagaradder 当您使用已关闭或从未打开的文件描述符调用系统函数时,请逐个提出问题,谢谢。 - user207421

2

我曾经遇到过同样的问题,发现可以将flag参数设为MSG_NOSIGNAL,而不是0,以防止send函数在套接字关闭时抛出信号。相反,它会返回-1来表示发送失败。

int rc = send(sockFD, "data", 4, MSG_NOSIGNAL);
if (rc == -1) cout << "socket send failed" << endl;

在这种情况下,send()将返回-1,并且errno == EPIPE,这与OP所述的一致。不清楚他是否收到信号而不是errno - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接