Quote of the Day (QOTD) Protocol

Quote of the Day is a simple protocol that is used to deliver daily quotes. Although its usage is almost nonexistent these days, there are still a few public servers. The protocol is defined by RFC 865. According to the RFC, a QOTD server is run on port 17 for TCP and UDP connections.

The RFC recommends that;

  • The quotes should be limited to the ASCII printable characters, spaces and newlines.
  • They should be less than 512 characters.

Since the protocol is only used to send quotes to terminals, these aren’t hard requirements. But a server should still follow these recommendations in order to be compatible with the other servers and clients.

Despite the name being Quote of the Day, a server does not have to serve daily quotes. It can change the quote at any interval or send random quotes at each connection.

TCP Connections

When a QOTD server gets a connection, it sends a quote and closes the connection, discarding any received data. Basically, a server should do the following

  • Listen to connections on port 17.
  • Accept a connection.
  • Choose a random quote.
  • Send the quote to the client.
  • Close the connection.

UDP Connections

A UDP server is a bit different from a TCP one. Since UDP has no concept of connections, a server just sends the quote after getting a UDP datagram.

  • Listen to UDP datagrams on port 17.
  • When you get a UDP packet:
    • Discard any data in the packet.
    • Send a UDP datagram containing the quote back to the client.

Public QOTD Servers

Server Address TCP Port UDP Port
cygnus-x.net 17 17
djxmmx.net 17 17

Example Server in Python

import socket
import random

quotes = [
    "Never do today what you can do tomorrow",
    "Nobody lies on the internet",
    "The cake is a lie"
]

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("0.0.0.0", 17)) # Bind to port 17
server.listen(5)

while True:
    sock, addr = server.accept()
    quote = "{}\n".format(random.choice(quotes))
    sock.send(quote)
    sock.close()

Comments BETA