Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 服务器断开连接时发送到套接字_C++_Linux - Fatal编程技术网

C++ 服务器断开连接时发送到套接字

C++ 服务器断开连接时发送到套接字,c++,linux,C++,Linux,我使用下面的函数是为了 int sendData(int const Socket, unsigned char const * const Data, size_t const Length) { return send(Socket, Data, Length, 0); } 函数返回发送字节数 如果我断开服务器连接,此函数返回的发送字节数等于长度。看起来系统不知道另一端断开了 如何解决这个问题?我猜您的连接是TCP 通常send()方法检测关闭的连接并返回-1。但遗憾的是,您无法始

我使用下面的函数是为了

int sendData(int const Socket, unsigned char const * const Data, size_t const Length)
{
    return send(Socket, Data, Length, 0);
}
函数返回发送字节数

如果我断开服务器连接,此函数返回的发送字节数等于
长度
。看起来系统不知道另一端断开了


如何解决这个问题?

我猜您的连接是
TCP

通常
send()
方法检测关闭的连接并返回-1。但遗憾的是,您无法始终检测到断开的连接(我了解到断开的连接可能在30分钟内不会引起)


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

通过套接字发送数据属于低级操作。成功的发送并不保证在另一端会有成功的接收

说:

send()中没有隐含传递失败的指示

因此,服务器将必须发送回一个确认,以便客户端确认

作为旁注,您的函数只是重新创建系统
write
函数。根据:

send()和write(2)之间的唯一区别是存在标志。对于零标志参数,send()相当于write(2)


要检测是否存在连接故障,而不是依赖于您的写操作(正如Galik所说,这是不可靠的),请使用

在出现错误时,它返回-1,并相应地设置errno

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


另外,可以使用套接字来确定其状态何时更改,这是Unix Linux系统上所有写入系统调用的常见问题。该函数应在请求排队后立即成功返回。磁盘写入也是如此

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


因此,没有什么可以期待的了:在同一个句柄上读取(用于套接字)或刷新(用于文件)(当然也可以关闭)之前,您无法确定写入的
send
已到达其目的地。

我猜您的连接是
TCP
。遗憾的是,在
TCP
中,您可能无法完美地检测到断开连接。根据,通过始终将标志设置为
0
,您只需简单地重新实现
write()
函数,检测到TCP打开或关闭时,绝对不需要心跳(否则整个互联网都会陷入麻烦!)。它们通常仅用于报告应用程序处于活动状态且响应迅速,而不是在负载下挂起或挣扎。心跳可能会告诉您何时需要重新连接,但它不会告诉您特定消息已到达(心跳消息除外).
select
无法单独告诉您套接字是否已断开连接,只能告诉您套接字是否可读写。您仍然需要执行实际读取以确定套接字是否仍然连接。@RemyLebeau已修复