2

我有一个服务会在它启动后监听 8443 端口。我已将 xinetd 配置为在端口 8443 上建立连接时启动我的服务。

所以 Xinetd 应该启动我的应用程序,然后让我的应用程序处理更多的传入连接。

我重复“警告:无法获取客户端地址:传输端点未连接”,然后 Xinetd 禁用我的服务 10 秒。

这只发生在我设置 wait = yes 时。

阻止我的应用程序监听端口 8443 并没有什么不同。

我对 xinetd 等待标志的理解是正确的还是我对 xinetd 配置做错了什么?

我查看了手册页,wait=yes 通常与 UDP 相关联,但其中没有任何内容表明您不能将其与 TCP 一起使用。

我在 SO 上进行了搜索,发现的所有内容都有 tcp 与 wait=no 一起工作。

连接到 xinetd 时出现以下错误。

5786]: warning: can't get client address: Transport endpoint is not connected
5564]: EXIT: MyApplication status=1 pid=5786 duration=0(sec)
5564]: START: MyApplication pid=5787 from=<no address>
5787]: warning: can't get client address: Transport endpoint is not connected
5564]: EXIT: MyApplication status=1 pid=5787 duration=0(sec)
5564]: Deactivating service MyApplication due to excessive incoming connections.  Restarting in 10 seconds.
5564]: FAIL: MyApplication connections per second from=<no address>
5564]: Activating service MyApplication

我的配置是:

    disable = no
    socket_type = stream
    protocol        = tcp
    wait            = yes
    user            = user
    server      = /usr/bin/MyApplication
    port            = 8443
    type            = UNLISTED
    flags           = IPv4
4

2 回答 2

1

以防万一其他人遇到这个,我正在寻找同样的东西。从这里的一位维护者 Steve Grubb 的评论中,他说

等待服务是接受连接的服务。telnet 不接受连接 - 它期望连接被接受并且套接字复制到 stdin/out 描述符。

xinetd 也无法检查孩子是否接受了连接。因此,当您有一个程序被配置为等待服务并且它不接受连接时,当 xinetd 返回到选择循环时,套接字仍然是可读的。绕来绕去。

子服务器从 xinetd 分叉然后调用exec_server时启动。什么时候wait=true,正如上面提到的,子进程必须接受套接字上的连接。要获取套接字,可以将值为 0 的文件描述符与接受一起使用。我正在使用带有以下内容的python,

import socket

s = socket.fromfd(0, socket.AF_INET, socket.SOCK_STREAM)
print(s.accept())

它返回 (conn, address) 其中 conn 是一个新的套接字对象,可用于在连接上发送和接收数据。

于 2018-11-11T14:25:51.707 回答
-1

从手册页

   wait             This attribute determines if the service is single-threaded or multi-threaded and whether or not xinetd accepts the connection or the server program accepts  the
                    connection.  If  its  value  is yes, the service is single-threaded; this means that xinetd will start the server and then it will stop handling requests for the
                    service until the server dies and that the server software will accept the connection. If the attribute value is no, the service  is  multi-threaded  and  xinetd
                    will  keep  handling  new  service requests and xinetd will accept the connection. It should be noted that udp/dgram services normally expect the value to be yes
                    since udp is not connection oriented, while tcp/stream servers normally expect the value to be no.

所以如果你有 wait=yes 你是单线程的。一旦建立连接,在您当前的会话断开或脚本结束之前,其他任何东西都无法连接。

于 2017-10-31T23:02:30.787 回答