【问题标题】:Using STDIN/STDOUT as a socket使用 STDIN/STDOUT 作为套接字
【发布时间】:2013-05-23 17:51:43
【问题描述】:

我正在让一个客户端进程使用 xinetd 启动一个服务器进程。据我了解,服务器能够通过其 STDIN 从客户端读取,并通过其 STDOUT 写入客户端。由于各种原因(主要是让服务器能够使用 select() 然后 read() 或 recv() )我希望能够以某种方式将 STDIN 和 STDOUT 转换为套接字,然后在其上执行普通套接字 I/O,就像我的服务器将连接到的其他服务器一样。

这可以吗?这甚至是一个有意义的问题吗?

【问题讨论】:

    标签: perl sockets stdout stdin inetd


    【解决方案1】:

    您提到的所有函数调用都可以用于带有数字 STDIN_FILENO 和 STDOUT_FILENO(来自<unistd.h>)的文件描述符。所以我敢说你不需要任何改造。

    编辑:有点不正统,但是您是否尝试过在 STDOUT_FILE 上写入或在服务器中读取 STDIN_FILENO?通过快速浏览 xinetd 代码,看起来它只是将打开的套接字 fd 复制到服务器的所有 fd。也许您可以将其中任何一个用作全双工。

    我只看了here

      for ( fd = 0 ; fd <= MAX_PASS_FD ; fd++ )
       {
          if ( dup2( descriptor, fd ) == -1 )
          {
         msg_resume();
             msg( LOG_ERR, func,
                   "dup2( %d, %d ) failed: %m", descriptor, fd ) ;
             _exit( 1 ) ;
          }
       }
    

    【讨论】:

    • 很高兴知道这一点。我唯一的犹豫是服务器,正如它之前设计的那样,是以不同的方式启动的,这样每个连接都有一个真正的套接字,数据结构和算法只是假设每个套接字都是双向。因此,理想情况下,我将能够以某种方式将 STDIN/OUT 转换为套接字并使用现有代码。 (否则我将进入并特例化 STD 文件描述符。)
    • 根据您的编辑:我运行了一个测试服务器:my $input = ; log_info( $me, "Read '$input' from client. "); print STDIN "Hi there client\n"; 和一个打开 IO::Socket 的客户端,在上面打印“hello”,然后尝试在上面接收。服务器收到了我的问候,但随后向 STDIN 发出了错误打印:文件句柄 STDIN 仅为输入打开。不过,我不知道这是否准确地代表了您的建议,因为我不知道如何在 Perl 的 FILENO 级别工作。
    • 啊,我没有意识到你正在使用 Perl。很抱歉让您对 c 语言特定的答案感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多