【发布时间】:2023-04-05 21:07:01
【问题描述】:
背景/上下文
我有两个脚本,一个可以处理多个客户端的服务器端脚本,一个连接到服务器的客户端脚本。任何向服务器发送消息的客户端都会将该消息复制/回显给所有其他连接的客户端。
我被困在哪里。
今天下午,我一直在凭空寻找一个详尽的解释,其中包含有关 Perl 和 TCP 套接字的所有示例。来自 google 的大量搜索结果仍然列出了 2007-2012 年的文章。似乎最初有 'Socket' 模块,随着时间的推移,添加了 IO::Socket,然后添加了 IO::Select。但是 Perldoc 页面并没有在一个地方涵盖或引用所有内容,或者提供足够的交叉引用链接。我收集到 Socket 中的大多数原始调用在 IO::Socket 中都有一个等价物。如果某些东西不能通过 OO 模块获得,它可能(推荐?是/否?)在套接字上进行功能调用......
问题1.远端/对端已断开/套接字不再建立?
我一直在尝试我今天遇到的所有事情,包括调用 can_read、has_exception 的 IO::Select,但是无论套接字是打开还是关闭,这些输出都没有差异 - 我从 netstat 输出确认非-阻塞套接字被操作系统(MacOS)立即拆除。
问题 2. 是否有数据可供读取?
对于我以前的 perl 客户端脚本,我已经推出了自己使用 sysread (https://perldoc.perl.org/functions/sysread.html) 的方法,但今天我注意到 recv 列在此页面顶部 https://perldoc.perl.org/IO/Socket.html 附近的概要中,但是有在下面的详细信息中没有提到recv方法...
从其他 C 和 Java 文档页面中,我收集到在执行与 sysread 等效时返回 undef、0、>0 和在某些实现上返回 -1 的约定。是否有人可以将我链接到描述 Perl 实现的官方 perl 规范? sysread 或 recv 是首先从 TCP 套接字读取的“正确”方式吗?
我没有在这里提供我的代码,因为我从“最佳实践”的角度询问,进行客户端-服务器通信的“正确”方式是什么?民意调查甚至是正确的开始方式吗?有没有我错过的事件驱动方法..
如果我所要求的内容已经可用,我深表歉意,但 google 一直为我提供与我已经阅读过的相同的旧结果页面和衍生博客/文章。
非常感谢。
【问题讨论】:
-
这个类似于聊天服务器;也许选择一些已经存在的(Mojolicious?)而不是重新发明轮子,除非是出于教育目的。
-
谢谢,但我已经看过几个聊天服务器实现,但他们没有回答我的问题。像往常一样,在学习某些东西时,通常需要先从一个简单的例子开始,然后才能将其应用于更复杂的案例。 :) 但无论如何感谢您的回复。