背景/背景
我有两个脚本,一个可以处理多个客户端的服务器端脚本,和一个连接到服务器的客户端脚本。将消息发送到服务器的任何客户端都会将该消息复制/回显到所有其他连接的客户端。
我被困在那里。
今天下午,我一直在寻找一个透彻的解释,并提供涵盖Perl和TCP套接字的所有示例的详尽解释。Google惊人的大量结果仍然列出了2007-2012年的文章。原来那里似乎有'Socket'模块,随着时间的推移,先添加了IO :: Socket,然后添加了IO :: Select。但是,Perldoc页面并未在一个地方涵盖或引用所有内容,也没有提供足够的交叉引用链接。我收集到,大多数Socket中的原始调用在IO :: Socket中具有等效功能。如果无法通过OO模块使用某些功能,则可以(建议?是/否?)在套接字上进行功能调用...
问题1.远端/对等方已断开连接/套接字不再建立?
我一直在尝试今天遇到的所有事情,包括IO :: Select以及对can_read,has_exception的调用,但是无论套接字是向上还是向下,这些输出都没有区别-我从netstat输出确认了非阻塞套接字被OS(MacOS)立即拆除。
问题2.是否有可读取的数据?
对于我以前的perl客户端脚本,我已经介绍了自己的使用sysread(https://perldoc.perl.org/functions/sysread.html)的方法,但是今天我注意到该recv内容在本页顶部的概述中列出。https://perldoc.perl.org/IO/Socket.html,但是下面的详细信息中没有提及recv方法...
从其他C和Java doco页面中,我收集到一个约定,当执行等同于时,返回undef,0,> 0,在某些实现中为-1 sysread。是否有官方的Perl规范可以与我联系,以描述Perl已实现的内容?sysread或recv是首先从TCP套接字读取数据的“正确”方式吗?
我没有在这里提供代码,因为我是从“最佳实践”的角度询问的,进行客户端-服务器通信的“正确”方法是什么?轮询是正确的开始吗?有某种我错过了的事件驱动方法吗?
我诚挚的歉意是否已经提供了我所要求的内容,但是google一直给我相同的旧结果页和派生博客/文章,这些内容我已经读过。
提前谢谢了。
如果无法通过OO模块使用某些功能,则可以(建议?是/否?)在套接字上进行功能调用...
我不确定您引用的功能调用在IO :: Socket中不可用。但是通常,IO :: Socket对象也是普通的文件句柄。这意味着你可以做这样的事情$server->accept,但也accept($server)。
问题1.远端/对等方已断开连接/套接字不再建立?
这个问题并非特定于Perl,而是select和socket API通常如何工作。Perl在这方面没有添加自己的行为。通常:如果对等方已关闭连接,select则将显示该套接字可用于读取,如果对套接字进行了读取,则它将不返回任何数据,也不会返回错误-这意味着无法从该套接字读取任何数据。因为对等方已正确关闭了连接的另一端(连接关闭不被视为错误,而是正常行为)。请注意,即使对等端指示不再发送任何数据,TCP内仍可能将数据发送给对等端。
问题2.是否有可读取的数据?
sysread并且与基础libc中recv的相同read和recv/ recvmsg或不同。特别是recv可以具有标志,例如,这些标志允许在不读取数据的情况下窥探系统套接字缓冲区中的可用数据。有关更多信息,请参见文档。
我建议使用sysread代替,recv因为sysread在绑定文件句柄时可以重新定义的行为,而不能绑定行为recv。并通过IO :: Socket :: SSL绑定文件句柄,这样就不会返回来自底层OS套接字的数据,而是会返回来自SSL套接字的解密数据。
从其他C和Java doco页面中,我收集到一个惯例,即在执行等效于sysread的情况下,返回undef,0,> 0,并且在某些实现-1上。是否有官方的Perl规范可以与我联系,以描述Perl已实现的内容?
的行为有sysread据可查。引用使用时获得的信息perldoc -f sysread:
...返回实际读取的字节数,在文件末尾返回0,如果出现错误则返回undef(在后一种情况下,还设置了$!)。
除此之外,您陈述问题的原因在于是否有可供读取的数据?但你只谈sysread及recv,而不是如何检查数据调用这些函数之前可用。我假设您正在使用select(或IO :: Select,这只是一个包装器)执行此操作。虽然can_readIO的::选择可以用来获得在大多数情况下,信息只会从底层OS插座返回的信息。使用普通套接字就足够了,但是例如,当使用SSL时,SSL堆栈中can_read会进行一些内部缓冲,即使缓冲区中仍有可供读取的数据,也可能返回false。有关如何正确处理的信息,请参见常见用法错误:SSL套接字轮询。
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |