我有一个服务,它将在启动后侦听端口 8443。 我已将 xinetd 配置为在端口 8443 上建立连接时启动我的服务。
因此,Xinetd 应该启动我的应用程序,然后让我的应用程序处理更多的传入连接。
我收到重复的"警告:无法获取客户端地址:传输终结点未连接",然后 Xinetd 禁用我的服务 10 秒钟。
这仅在我设置等待 = 是时发生。
阻止我的应用程序侦听端口 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
以防万一其他人遇到这种情况,我正在寻找同样的东西。从一位维护者史蒂夫·格拉布(Steve Grubb)的评论中,他说
等待服务是接受 连接。telnet 不接受连接 - 它期望连接 被接受,套接字重复到标准/输出描述符。
xinetd 也没有办法检查孩子是否接受了 连接。因此,当您有一个配置为等待的程序时 服务,它不接受连接,套接字在以下情况下仍然可读 Xinetd 返回到选择循环。兜兜转转。
子服务器从 xinetd forks 然后调用 exec_server 时启动。当wait=true
时,作为上面的子进程必须接受套接字上的连接。要获取套接字,可以将值为 0 的文件描述符与 accept 一起使用。我正在使用python与以下内容,
import socket
s = socket.fromfd(0, socket.AF_INET, socket.SOCK_STREAM)
print(s.accept())
返回(conn,地址),其中conn是可用于在连接上发送和接收数据的新套接字对象。
来自手册页
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.
所以如果你有等待=是,你是单线程的。一旦有连接,其他任何东西都无法连接,直到您当前的会话断开连接或脚本结束。