我正在使用以下功能
int sendData(int const Socket, unsigned char const * const Data, size_t const Length)
{
return send(Socket, Data, Length, 0);
}
函数返回发送字节数。
如果我断开服务器,则此函数返回发送字节数等于Length
。看起来系统不知道其他方是断开连接。
如何解决这个问题?
答案 0 :(得分:2)
通过套接字发送数据是一种低级操作。成功发送并不能保证在另一端成功接收。
在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(对于文件) (当然还是关闭它)。