- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我知道这个问题有数百个答案,但就我的情况而言,我无法完成。场景是这样的,我们有一个用TCP/IP协议(protocol)写的服务器,我们有多个客户端连接到这个服务器上。这里的客户端是一个软件模块,它在客户端机器上启动之前,在服务器上注册它的存在并加载功能。但问题是这个软件模块崩溃了,并且没有 socket.close()
被调用,这将使得它的足迹仍然存在于服务器中,即使它崩溃了。如何识别?
我在客户端使用 select()
方法来通知来自客户端和服务器的任何信息(反之亦然) 我无法在服务器中为每个客户端请求单独创建一个进程,也无法在客户端机器中创建父子机制。 tcp-keepalive
不适用,因为我们需要在 Windows 中调整注册表?我需要一个 x 平台兼容的解决方案。我已经读到 recv()
到服务器代码中连接的套接字将从“那个”客户端返回一些值,例如 0
表示套接字已关闭?我可以用它来清除服务器数据库中的客户端套接字注册吗?这行得通吗?
最佳答案
您没有指定在服务器端代码中使用什么方法来处理套接字事件。无论您使用何种方法轮询套接字,recv()
将返回 0 或可能 -1/SOCKET_ERROR
当客户端崩溃时。
为了检测不活动的客户端连接,大多数服务器应用程序会在应用程序层协议(protocol)中定期发送某种形式的心跳或 ping 消息。当无法从客户端发送 ACK 时,服务器应用程序将通过 recv()
收到客户端断开连接的通知。返回 0 或 SOCKET_ERROR
错误代码类似于 WSAENETRESET
, WSAECONNABORTED
, WSAETIMEDOUT
, 或 WSAECONNRESET
(请参阅各种错误代码 here )。通常在服务器将心跳发送到不再事件的客户端 TCP 端口后,会发送一个 ICMP 数据包作为响应,提醒您的服务器端口或主机不活动(recv()
将立即通知您此事件)。
如果你想打开 TCP 保持事件计时器,你可以使用套接字选项 SO_KEEPALIVE .也可以使用 SIO_KEEPALIVE_VALS 设置间隔.
编辑:请记住各种错误代码和选项 SIO_KEEPALIVE_VALS 是特定于 Win32 的。要为其他操作系统处理这些事件,您将需要使用操作特定的方法来检索错误代码并设置 TCP 保持事件间隔(如果您选择这样做)。保持您的代码跨平台兼容的最佳建议是简单地将应用层心跳消息实现到您的协议(protocol)或其他一些应用层特定的超时中。这样做会让您忘记管理 TCP keep alives。
我无法对 EJP 的回答发表评论,但重要的是要通过调用 send()
指出这一点他有效地建议您在协议(protocol)的应用层中实现心跳/ping 消息。在检查 send()
的返回值时很重要,如果您正在轮询/选择读取事件,您将在调用 recv()
时立即收到 TCP 连接断开的通知。 TCP 堆栈认为连接断开的那一刻。如果您等待应用程序计时器尝试使用 send()
发送一些数据在 recv()
之后可能有很多秒(取决于您的间隔计时器的长度)已经通知您连接已断开。换句话说:注意 recv()
返回值以及您的 send()
返回值。
关于c - 检测断开的客户端套接字连接(跨平台适用性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38366151/
我正在开发一组应用程序,它们协同工作以创建一个用于处理计量数据的系统。我想让它们松散耦合有几个原因,并且系统应该可以由第三方扩展,因此应用程序将通过消息传递绑定(bind)在一起。 我正在寻找一种消息
如果我使用 python 2.6 和 Qt 为 windows 创建一个 gui,然后想在 solaris 或 linux 世界中运行。 我在两个系统上都需要什么,我猜两个平台都需要 2.6 和 Qt
我正在运行 Linux Ubuntu 10.04,我有一台 Windows 7 机器和一台运行 Mac OS X 10.6.4 的 MacBook。我如何编写一个简单的 C 程序(如 不是 QT!),
前言 今天给大家分享一个.NET开源(MIT License)、免费、跨平台(适用于 Windows、MacOS 和 Linux )、使用简单的面部识别库:FaceRecognitionDotNet
我知道汇编语言通常不是跨平台的。即使使用像 NASM 这样的东西,对于不同的架构和平台,您仍然需要不同的代码,这些架构和平台具有不同的运行时和诸如中断之类的东西的实现。但是如果有人因为喜欢汇编语言而想
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
This question already has answers here: How to play audio? (20个答案) 12天前关闭。 我正在编写一个dhtml应用程序,该应用程序创建系
我正在使用MonoGame开发一款游戏,该游戏使用SoundEffectInstance来实现游戏中的音效。在可以创建的SoundEffect实例数量以及可以同时播放的最重要实例方面,不同平台受到什么
如何在 java 中找到并运行默认计算器而不使我的程序依赖于平台。我可以对每个主要操作系统的所有路径进行硬编码,然后找到该人正在使用的操作系统,然后使用该操作系统各自的路径。但是,我不想那样做,有没有
有没有办法使用捏合来放大共享的Xamarin Forms,我只找到了每个平台的实现。 最佳答案 您可以使用 Pan Gesture 来实现它。这里有一个很好的在 PanContainer 中包装图像的
是否有最好/好的方法来同时为 Android 和 iOS(以及 Mac OS X)开发跨平台应用程序,例如游戏? 只是简单地开发一个仅使用 OpenGL 和 C/C++ 的应用程序应该很简单,不是吗?
我想知道 CSS 行为是否会随着操作系统的不同而变化。我的 css 对于 vista 和 win xp proffesional 对于相同版本的浏览器来说有点不同。我在 vista + ie8 和 x
我需要一种跨平台的方式来检查给定的文件路径是否是绝对的而不使用Pathname 库。为此,我唯一希望依赖的库是 File。它需要跨平台和跨实现,因此无论是 Ruby MRI、JRuby、Rubiniu
我正在尝试寻找一种跨平台的方法来从文件末尾删除 X 字节。 目前我发现: 特定于平台的解决方案(例如 truncate for posix):这是我不想要的,因为我希望 C++ 程序可以在多个平台上运
我想将可执行文件从一个目录复制到另一个目录。 源目录包括各种我不关心的文件(构建工件)。我只想使用适用于 OS X 和 Linux 的 bash 脚本获取可执行文件。 可执行文件是指具有可执行权限的文
我需要能够在服务器端处理简单 HTTP GET/PUT 请求的库。有一些特殊要求: 应该是跨平台的(这是主要因素) 支持多线程。 高性能 支持 HTTPS 许可证应允许链接专有代码(LGPL、BSD)
我正在寻找一种可用于从 Windows 和 Mac OSX 计算机上传大型 (~2GB) 文件的技术。应该可以根据请求/错误暂停和恢复上传。具有基本计算机技能的用户应该可以轻松安装最终产品。 我正在考
我正在寻找一种使用 java 播放 .flv 文件的方法。这意味着我需要一个跨平台的 ffmpeg 库。我一直在玩弄 jmf 和 fobs4jmf,但我无法在 linux 中播放,因为我需要一个本地库
我想在基于浏览器的应用程序中做的一件事是允许用户选择一些文本(不是在 中,只是普通的文本!),然后让我的应用程序弹出一个然后可以与下一个交互的小工具栏(在我的例子中,添加注释)。 我在 google
对于 PyInstaller 中的新功能,我们需要一个命令行选项来接收其中包含任何分隔符的字符串。这是讨论:https://github.com/pyinstaller/pyinstaller/pul
我是一名优秀的程序员,十分优秀!