【问题标题】:TCP server that serves unix time服务于 Unix 时间的 TCP 服务器
【发布时间】:2016-03-01 19:42:23
【问题描述】:

有没有办法通过 bash/nc/xinetd/nginx 巧妙的诡计来运行一个只输出 Unix 时间然后断开连接的 TCP 服务器?

客户端连接到 TCP 服务器,服务器以字符串形式输出 unix 时间,例如“1456860938”,然后服务器断开客户端。

服务器应该继续运行以服务许多客户端,但每次连接的时间很短。

【问题讨论】:

  • 使用带有 php 的网络服务器和带有此内容的 php 页面:echo time(); 输出为(例如):1456861853
  • 尽量不要写另一个网络服务器代码,虽然它会很简单。

标签: bash unix-timestamp netcat xinetd


【解决方案1】:

一个快速的 python 脚本可能会解决问题。我引用了这个socket programming tutorial。这纯粹是 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

【讨论】:

    【解决方案2】:

    假设您运行的是标准 inetd,您只需将 date 添加到 /etc/inetd.conf 即可:

    daytime            stream tcp      nowait  nobody  /bin/date date +%s
    

    重新加载(sudo pkill -HUP inetd)后,可以验证结果:

    $ netcat localhost daytime
    1456915174
    

    (很明显,如果您已经在那里运行守护程序,请使用daytime 以外的端口)。

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 2020-09-02
      • 2013-12-10
      • 2013-07-01
      • 2020-09-19
      • 2013-04-11
      • 2012-08-21
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多