在服务器被取消时发送到套接字

时间:2018-05-30 12:19:04

标签: c++ linux

我正在使用以下功能

int sendData(int const Socket, unsigned char const * const Data, size_t const Length)
{
    return send(Socket, Data, Length, 0);
}

函数返回发送字节数。

如果我断开服务器,则此函数返回发送字节数等于Length。看起来系统不知道其他方是断开连接。

如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

通过套接字发送数据是一种低级操作。成功发送并不能保证在另一端成功接收。

The Manual说:

  

在send()

中隐含没有表示未能交付

因此,服务器必须向客户发回确认信息。

作为旁注,您的功能只是重新创建系统write功能。根据{{​​3}}:

  

send()和write(2)之间的唯一区别是标志的存在。使用零标志参数,send()等效于write(2)。

答案 1 :(得分:0)

我猜您的连接是TCP

通常send()方法检测已关闭的连接并返回-1。但遗憾的是,您无法一直检测到断开的连接(我读到断开的连接可能导致最多30分钟)。

最好的方法是在您的连接中发送heartbeats。如果您没有获得任何心跳,则表示连接(或目标服务)已关闭。然后,您可以在重新连接后关闭套接字并发送数据。

答案 2 :(得分:0)

要检测是否存在连接失败,而不是依赖于您的写入(正如Galik所说,不可靠),请使用read

出错时,返回-1,并相应地设置errno。

在正常断开连接时,它将返回0。

作为额外的,可以在套接字上使用select来确定其状态何时发生变化

答案 3 :(得分:0)

这是Unix-Linux系统上所有编写系统调用的常见问题。一旦请求排队,该函数将成功返回。对于磁盘写入也是如此。

如果实际操作中发生错误(断开连接的插件或磁盘错误),可能会在不同的访问中报告,至少在close上报告:这就是close的原因可能会报告各种错误。

所以没有什么可以期待的:你不能确定send的{​​{1}}已到达目的地,直到你在同一个句柄上读取(对于套接字)或flush(对于文件) (当然还是关闭它)。