有没有办法通过 bash/nc/xinetd/nginx 巧妙的技巧来运行一个只输出 Unix 时间然后断开连接的 TCP 服务器?
客户端连接到 TCP 服务器,服务器以字符串形式输出 unix 时间,例如“1456860938”,然后服务器断开客户端。
服务器应该继续运行以服务许多客户端,但每个连接的时间长度很短。
有没有办法通过 bash/nc/xinetd/nginx 巧妙的技巧来运行一个只输出 Unix 时间然后断开连接的 TCP 服务器?
客户端连接到 TCP 服务器,服务器以字符串形式输出 unix 时间,例如“1456860938”,然后服务器断开客户端。
服务器应该继续运行以服务许多客户端,但每个连接的时间长度很短。
假设您正在运行一个标准inetd
,您可以简单地date
添加/etc/inetd.conf
:
daytime stream tcp nowait nobody /bin/date date +%s
重新加载(sudo pkill -HUP inetd
)后,您可以验证结果:
$ netcat localhost daytime
1456915174
daytime
(显然,如果您已经在那里运行守护程序,请使用其他端口)。
一个快速的 python 脚本可能会解决问题。我参考了这个套接字编程教程。这纯粹是 TCP,而不是 HTTP 服务器
'''
TCP Time Server
'''
import socket
import sys
import time
import signal
HOST = '' # blank for All interfaces
PORT = 8000 # Port to listen on
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Signal handler to close the socket on exit
def signal_handler(signal, frame):
s.close()
sys.exit(0)
# Bind to port
try:
s.bind((HOST, PORT))
signal.signal(signal.SIGINT, signal_handler)
except socket.error as msg:
print('Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
sys.exit()
# Listen for connections
s.listen(1)
print('Ready to serve')
# Except connections forever
while 1:
#wait to accept a connection - blocking call
conn, addr = s.accept()
conn.sendall(str(int(time.time())))
conn.close()
样本输出:
$ nc localhost 8000
1456868540