背景/语境
我有两个脚本,一个可以处理多个客户端的服务器端脚本,以及一个连接到服务器的客户端脚本。向服务器发送消息的任何客户端都会将该消息复制/回显给所有其他连接的客户端。
我被困在哪里。
今天下午,我一直在凭空寻找一个详尽的解释,其中包含有关 Perl 和 TCP 套接字的所有内容的示例。来自谷歌的惊人大量结果仍然列出了 2007-2012 年的文章。似乎最初有“套接字”模块,随着时间的推移添加了 IO::Socket,然后是 IO::Select。但是 Perldoc 页面并没有在一个地方涵盖或引用所有内容,也没有提供足够的交叉引用链接。我收集到,Socket 中的大多数原始调用在 IO::Socket 中都有等效项。如果某些东西无法通过 OO 模块获得,则有可能(推荐?是/否?)在套接字上进行功能调用...
问题 1. 远端/对端已断开连接/套接字不再是 ESTABLISHED?
我一直在尝试我今天遇到的所有事情,包括 IO::Select 调用 can_read、has_exception,但是无论套接字是打开还是关闭,这些输出都没有显示差异 - 我从 netstat 输出中确认非-阻塞套接字会被操作系统 (MacOS) 立即拆除。
问题2.是否有数据可供读取?
对于我以前的 perl 客户端脚本,我已经推出了我自己的使用 sysread ( https://perldoc.perl.org/functions/sysread.html ) 的方法,但是今天我注意到 recv 列在该页面顶部 https://perldoc.perl.org/IO/Socket.html 附近的概要中,但是在下面的详细信息中没有提到 recv 方法......
从其他 C 和 Java doco 页面中,我了解到在执行与 sysread 等效的操作时,有一个返回 undef、0、>0 和某些实现 -1 的约定。有没有人可以将我链接到描述 Perl 已实现内容的官方 perl 规范? sysread 或 recv 是首先从 TCP 套接字读取的“正确”方法吗?
我没有在这里提供我的代码,因为我从“最佳实践”的角度询问,进行客户端-服务器通信的“正确”方式是什么?投票甚至是正确的开始方式吗?有没有我不知何故错过的事件驱动方法..
如果我要求的内容已经可用,我深表歉意,但谷歌一直给我相同的旧结果页面和我已经阅读过的衍生博客/文章。
非常感谢。
最佳答案
And its possible (recommended ? yes/no?) to do a functional call on the socket if something isn't available via the OO modules...
我不确定您指的哪些功能调用在 IO::Socket 中不可用。但通常 IO::Socket 对象也是普通文件句柄。这意味着您可以执行 $server->accept 以及 accept($server) 之类的操作。
Problem 1. The far-side/peer has disconnected / the socket is no longer ESTABLISHED?
这个问题不是 Perl 特有的,而是如何 select和套接字 API 一般工作。 Perl 没有在这方面添加自己的行为。一般而言:如果对等方已关闭连接,则 select 将显示套接字可供读取,如果对套接字进行读取,它将不返回任何数据,也不会返回任何错误 - 这意味着没有由于对等方已正确关闭其连接端(连接关闭不被视为错误,而是正常行为),因此可以从对等方读取更多数据。请注意,即使对等方已指示不再发送任何数据,在 TCP 中仍有可能向对等方发送数据。
Problem 2. Is there data available to read?
sysread 和recv 与read 和recv/recvmsg 不同> 或底层 libc 不同。具体来说,recv 可以有标志,例如允许在不读取数据的情况下查看系统套接字缓冲区中可用的数据。查看the documentation获取更多信息。
我建议使用 sysread 而不是 recv 因为当 tying a file handle 时可以重新定义 sysread 的行为而 recv 的行为则不能。并绑定(bind)文件句柄例如由 IO::Socket::SSL 完成因此返回的不是来自底层操作系统套接字的数据,而是来自 SSL 套接字的解密数据。
From other C and Java doco pages, I gather there is a convention of returning undef, 0, >0, and on some implementations -1 when doing the equivalent of sysread. Is there an official perl spec someone can link me to that describes what Perl has implemented?
sysread 的行为有详细记录。引用使用 perldoc -f sysread 时得到的内容:
... Returns the number of bytes actually read, 0 at end of file, or undef if there was an error (in the latter case $! is also set).
除此之外,您将问题描述为 是否有数据可供读取? 但随后您只谈论了 sysread 和 recv 以及不是如何在调用这些函数之前检查数据是否可用。我假设您正在使用 select(或 IO::Select,它只是一个包装器)来执行此操作。虽然 IO::Select 的 can_read 可用于在大多数情况下获取信息,但它只会从底层操作系统套接字返回信息。对于普通套接字,这就足够了,但是例如,当使用 SSL 时,SSL 堆栈中会进行一些内部缓冲,即使缓冲区中仍有数据可供读取,can_read 也可能返回 false。参见 Common Usage Errors: Polling of SSL sockets关于如何正确处理这个问题。
关于Perl 和服务器-客户端套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189467/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby