linux - TCP 客户端未从虚拟机获得 Socket.Send 的回复

标签 linux sockets tcp virtual-machine

我有一个 TCP 客户端,它通过网络与虚拟机上运行的服务器进行通信,现在虚拟机的 guest 操作系统为 IBM OS 4690,主机操作系统为 Linux。

偶尔,在 guest 操作系统上运行的 TCP 服务器应用程序会重新启动。似乎在重新启动之前正确调用了套接字关闭。

一旦重新启动,当客户端尝试执行Socket.Send时,它不会从服务器获得任何响应。

如果服务器在物理硬件上运行,则客户端能够通过 TCP 错误 10054 检测到连接重置。当服务器在虚拟机上运行时,不会出现这种情况。

最佳答案

您的 TCP 客户端应该做好发送请求根本不会得到答复的准备。想象一下当 TCP 客户端发送数据并且服务器机器突然重新启动(或断电)时的情况。客户端应用程序将不会获得任何 TCP RST 标志(错误 10054)。

例如,您可以在应用程序协议(protocol)中添加重传逻辑来处理此类情况。 它可以是这样的:

    -客户端发送数据
    - 如果在预定义的时间内没有响应或连接关闭 - 重复请求(数据发送)。
    - 如果尝试次数超过某个值(例如 5),则声明服务器不可用。

关于linux - TCP 客户端未从虚拟机获得 Socket.Send 的回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21633700/

相关文章:

c - 选择多个非阻塞连接

java - 使用qt通过套接字发送图像并使用java读取它

c++ - Boost::ASIO:优化以最小的流量,长连接,小消息,立即传递

linux - 从 Eclipse Luna 访问远程 Glassfish4 服务器

java - 找不到 gradlew 命令?

java - 如何测量丢弃的UDP消息数?

java - "java.net.BindException: Address already in use"尝试快速创建和销毁 Socket 以进行负载测试

c# - 如何从 telnet 或 SSH 访问 c# 套接字服务器?

linux - Echo 命令行问题

linux - 在进程替换中的命令失败后,bash pipefail 仍在运行 w/set -e