PHP套接字服务器,检查客户端是否还活着

2023-12-26

我有一个 php 服务器正在监听 1 个 c# 客户端。

当连接建立后,它会一直保持活动状态,直到客户端发送“退出”命令来终止 PHP 服务器。

但是,当 C# 客户端在没有“退出”命令(即:单击 Windows 窗体中的关闭 (x) 按钮)的情况下断开连接时,服务器只会继续侦听,并且无法从该客户端接收任何其他连接。

有没有办法从服务器端(PHP)检查与客户端的连接是否仍然有效?

我的 php 服务器代码基于以下示例1:http://php.net/manual/en/sockets.examples.php http://php.net/manual/en/sockets.examples.php

如果有人有兴趣重现错误/错误行为,请粘贴 example1 中的代码:http://php.net/manual/en/sockets.examples.php http://php.net/manual/en/sockets.examples.php,从 LAN 中的远程客户端通过 telnet 连接,拔下客户端线路... php 服务器将永远挂起,不接受新连接。


在循环中,您需要检查返回值socket_read() http://php.net/manual/function.socket-read.php。如果返回 FALSE,则存在读取错误(这可能是由远程主机关闭连接引起的)。您提供的链接中的示例代码涵盖了这种情况。

如果您需要优雅地处理某些错误状态,您始终可以使用以下命令检查套接字错误代码socket_last_error() http://php.net/manual/function.socket-last-error.php -- 这张纸条 http://php.net/manual/en/function.socket-last-error.php#95160描述可能的代码。

Edit:

当使用 putty 进行 telnet 时,如果我用 X 按钮关闭,则 PHP 中的连接会正确关闭,但如果我拔掉 putty 机器的以太网线,PHP 服务器就会挂起。

杀死 PuTTY 时连接被关闭的原因是 PuTTY 在退出时关闭其打开的连接。这导致socket_read()返回错误代码(我相信ECONNRESET)。如果你拔掉网线,它就没有机会这样做。

TCP 连接取决于您的网络配置方式should最终失败。您可以尝试通过设置来控制超时SO_RCVTIMEO https://www.php.net/manual/function.socket-get-option.php with socket_set_option() https://www.php.net/manual/function.socket-set-option.php,但这并不总是适用于所有平台(我在看着你,WinSock).

或者,您可以使用以下方式滚动自己的轮询循环socket_select() http://php.net/manual/function.socket-select.php有合理的超时时间。如果超时后所有连接的套接字都没有数据要发送,则终止服务器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP套接字服务器,检查客户端是否还活着 的相关文章

  • 有没有一种简单的方法来获取 PHP 中实例化类的文件?

    我想复制这个 myObject new object FILE class object protected path to caller public function construct file this gt path to cal
  • mysql - 如果日期不与现有日期重叠,则将日期范围插入日期列

    我有以下表结构 表名 available id autoincremetn acc id start date end date 1 175 2015 05 26 2015 05 31 2 175 2015 07 01 2015 07 07
  • 电子商务网站的货币换算 - 防止因四舍五入而出现错误的总购物车

    我正在向电子商务应用程序添加多货币支持 我解决这个问题的方法是让应用程序保持其基础货币 并让模板在显示价格时调用 PriceDisplay 函数 插件 因此 模板继续接收以美元金额表示的价格 如果需要 priceDisplay 函数会正确转
  • PHP 简化三元运算

    在 PHP 中 有没有一种方法可以进一步简化 而不使用if foo bar 0 foo 我想知道是否有办法不重新分配 foo如果条件满足 则返回到自身 我知道有一种方法可以在 Javascript 中做到这一点 使用 对吧 但我想知道是否有
  • mysql utf8_general_ci 区分大小写

    我有一个 mysql 数据库 我使用 utf8 general ci 不区分大小写 在我的表中 我有一些列 例如 ID 和区分大小写的数据 例如 iSZ6fX 或 AscSc2 为了区分大写和小写 最好只在这些列上设置 utf8 bin 如
  • 在通过 AJAX 响应发送的页面上执行 javascript 函数

    我想执行一个从服务器通过 AJAX 请求发送的函数 函数体不在调用页面中 例如 完整代码如下 1 调用PHP脚本
  • 使用 XAMPP 在 Windows 10 中安装 go-pear.phar 时出错

    我在尝试安装时总是遇到错误go pear phar 这是点击后的错误Enter对这个问题1 13 all or Enter to continue 1 13 all or Enter to continue ERROR Please ent
  • PHP PDF生成问题

    我使用 FPDF 在 PHP 中创建 pdf 我使用会话变量将变量在一种表单之间传递到另一种表单 当我提供一个值时 Report php
  • CodeIgniter“找不到您请求的页面。”错误?

    我在使用 CodeIgniter 时遇到问题 我已经检查了互联网上所有可能的解决方案 似乎对我的情况没有任何帮助 我不是一个大专业人士 这是我第一次使用 CodeIgniter 所以不要对我严厉 路线 php route default c
  • 使用ffmpeg转换文件时PHP内部服务器错误500

    我有一个 PHP 脚本 在我的服务器中通过 cron 作业调用它来运行上传的视频转换 它对于某些视频效果很好 但是当视频稍大一点 例如 21MB 时 我会得到一个500 Internal Server Error并且没有其他输出 我认为这个
  • socket.io 切换命名空间

    我目前正在与 socket io 进行简单的聊天 基础知识已经可以工作 但现在我正在尝试实现 2 个不同的命名空间 我希望客户端能够通过单击按钮从一个命名空间 支持聊天 切换到另一个命名空间 朋友聊天 服务器端 default namesp
  • 使用 SFTP 上传文件

    我已成功通过 ftp 上传文件 但现在需要通过 SFTP 上传 我可以成功连接到远程服务器 创建文件并写入文件 但无法将现有文件从本地服务器上传到远程服务器 ftp put 没有通过 sftp 连接触发吗 我的代码用来编写一个文件 Send
  • Zend Framework 调用另一个控制器操作

    您好 我在这里遇到调用另一个控制器操作来发送邮件的问题 这是我的代码 user php public function followAction follow id this gt getParam id response a href c
  • PHP 和 ESB(使用 Mule)(ESB:企业服务总线)

    您在 PHP 项目中何时 何地以及为何使用 ESB 您认为在何处 何时以及为何在 PHP 项目中使用 ESB 有意义 ESB 以及像 Mule 这样的 ESB 促进者 是否提供了 PHP 和本地 LAMP 技术所缺乏的任何功能 Edit 我
  • 原则 2 使用 QueryBuilder 进行条件多行更新

    这个问题有一些答案 但实际上 它们似乎都无法帮助完成一项简单的任务 我需要使用 Doctrine2 QueryBuilder 根据一个查询中的条件更新多行 最明显的方法应该是错误的 userAgeList user name a gt 30
  • PHP 和 MySQLi 中没有选择数据库错误[重复]

    这个问题在这里已经有答案了 我必须从 MySQL 数据库中选择数据 我一直在寻找答案 但仍然没有找到 我正在学习W3School http www w3schools com php php mysql select asp 我的 MySQ
  • PHP exec() 返回值是什么?

    我正在尝试使用 PHP exec 函数 如果 return var 参数与输出参数一起存在 那么执行命令的返回状态将被写入此 多变的 如果执行成功 则为 0 但是 如果出现错误 则可能是多个其他整数 我似乎无法在任何地方找到这些整数对应的内
  • 接口实现:声明必须兼容

    我有界面 interface AbstractMapper public function objectToArray ActiveRecordBase object 和课程 class ActiveRecordBase class Pro
  • 通过 Laravel 框架集成现有项目?

    我已经从 github 克隆了一个项目 现在我需要集成该项目 那么如何使用 laravel 框架 我是否需要创建一个新项目然后需要替换文件夹 或任何其他替代方案 因为我是这个框架的新手 帮助我 这是一个广泛的问题 因为这取决于您的项目 而我
  • NicEdit 数据不在 POST 中

    我确信我在这里错过了一些非常简单的东西 我已经搜索过 但似乎找不到答案 用这个简单的形式 我如何将 NicEdit 框中的内容发送到我的 HTTP POST 我得到的只是原始文本区域值而不是编辑后的版本 h2 Test Page h2

随机推荐

  • 使用 Firebase OAuth 保护 RESTful API?

    我在 iOS 和 Web 应用程序中使用 Firebase 来处理用户身份验证 我需要确保用户已登录 然后才能向我的 API 发出任何请求 我如何使用 Firebase 完成这样的事情 我正在考虑使用 Kong https getkong
  • R 中的大型固定效应二项式回归

    我需要在一个相对较大的数据框架上运行逻辑回归 该数据框架包含 480 000 个条目和 3 个固定效应变量 固定效应 var A 有 3233 个级别 var B 有 2326 个级别 var C 有 811 个级别 所以总共我有 6370
  • RSS 项目描述中的图像

    我开始为我的新网站进行 RSS 开发 但我想知道是否有任何方法可以将图像放在项目的描述中 如下所示
  • 当视图已经加载时,如何使用出现的键盘打开视图?

    我有一个要求 在视图中有一个文本字段 当我想通过切换选项卡 基于选项卡的应用程序 打开视图时 第一次加载视图时会出现键盘 因为我调用了 loadview 方法 但是当我切换到 tab2 并再次切换到 tab1 时 不会调用加载视图 我希望每
  • 在银河系坐标中绘制热图

    EDIT 好吧 我想出了一个糟糕的方法来做到这一点 涉及scipy interpolate griddata 我有一些二维数组 130x360 形式的地图 数组中的每个值对应于该点的测量值 这些地图以赤经 ra 和赤纬 dec 形式提供 范
  • 如何获取字符串的第一个单词并将其转换为 int? jQuery

    我需要获取字符串中的第一个单词 并将其转换为整数 如何使用 jQuery 做到这一点 example 223 洛雷姆 伊普苏姆 多洛尔 I need 223 并且它必须转换为integer 任何帮助 将不胜感激 您可以根据任何字符 例如空格
  • iPad 上禁用嵌入式 Youtube 播放器中的全屏按钮

    在研究了 stackoverflow 上至少十个类似的问题后 我似乎偶然发现了一些新东西 最近 不确定具体什么时候停止工作 嵌入式 YouTube 视频上的全屏按钮在 iPad 上被禁用 如果我尝试单击它 则会弹出 您的浏览器不支持全屏 的
  • 使用 lerna 将自定义参数发送到 npm (yarn) 脚本

    我在尝试将参数传递给npm脚本与lerna 我有一个节点脚本 我想在工作区的每个包中运行它 lerna文档建议如下 scripts my script lerna exec node LERNA ROOT PATH scripts my s
  • Swift 一次删除多个对象 Parse 服务器

    我向服务器查询如下 let query PFQuery className posts query whereKey uuid equalTo Ncell uuidLbl text query findObjectsInBackground
  • 从远程 SQLite 数据库复制表?

    有没有办法将数据从一个远程 SQLite 数据库复制到另一个 我在两台服务器上完成了文件复制 但是 一些更改会记录在每个服务器本地的 SQLite 数据库中 为了使文件复制正常工作 我需要复制一个表的内容并将其输入到另一系统上的表中 我知道
  • 如何保护database.yml?

    在 Ruby on Rails 应用程序中 database yml 是一个存储数据库凭据的纯文本文件 当我部署 Rails 应用程序时 我的 Capistrano 中有一个部署后回调 在应用程序的 config 目录中创建到 databa
  • 如何在Ubuntu中生成核心转储文件[重复]

    这个问题在这里已经有答案了 我想知道如何在 Ubuntu 中生成核心转储文件 我使用的是 Ubuntu 8 04 1 和 gcc 编译器 4 2 3 我编写了一个简单的 C 程序来生成核心转储 我已经编译了该程序 如 gcc g badpo
  • 从 StructureMap 获取的 HttpContext 上的空用户

    好吧 我之前的问题 设置有太多变量 所以我将其精简为最基本的组件 给出使用 StructureMap3 的以下代码 IoC setup For
  • 回发或回调参数无效。为什么?

    所以我得到了例外 回发或回调参数无效 使用启用事件验证 在配置或 在 页 出于安全目的 这 功能验证参数 回发或回调事件发起 从服务器控制 最初渲染它们 如果数据 是有效且预期的 使用 ClientScriptManager Registe
  • libreoffice 大量文本颜色更改

    有没有办法更改 LibreOffice 或 Openoffice 中文本中所有出现的特定颜色 是 光标位于find box hit more options 在里面Search Replace对话 点击 Format select Font
  • 如何在Windows 7中设置Python路径[重复]

    这个问题在这里已经有答案了 我尝试在 Windows 7 中设置 python 的路径 但我不能这样做 我去 My Computer gt Properties gt Advanced gt Environment Variables 但我
  • 使用空格而不是制表符进行缩进的客观原因是什么?

    根据 PSR 2 标准使用空格而不是制表符来缩进文件是否有客观原因 有人可以提供 facts 参考 具体的专业知识 PSR 2 标准基于哪个 PSR 2 标准的作者考虑的不仅仅是 外观和感觉 不仅仅是基于意见的东西 而且很多人很难理解为什么
  • 将 Excel 导入 Rails 应用程序

    我正在创建一个供个人使用的小型 Rails 应用程序 并且希望能够上传 Excel 文件以便稍后进行验证并添加到数据库中 我之前曾对 csv 文件进行过此操作 但此后这已变得不切实际 有谁知道使用 roo 或电子表格 gem 上传文件 向用
  • 带颜色编码的 vb.net/C# 代码编辑器[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何带有颜色编码的 winforms 源代码编辑器控件 首选 开源 我好像记得以前遇到过类似的事情
  • PHP套接字服务器,检查客户端是否还活着

    我有一个 php 服务器正在监听 1 个 c 客户端 当连接建立后 它会一直保持活动状态 直到客户端发送 退出 命令来终止 PHP 服务器 但是 当 C 客户端在没有 退出 命令 即 单击 Windows 窗体中的关闭 x 按钮 的情况下断