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(("", 17)) # Bind to port 17

while True:
    sock, addr = server.accept()
    quote = random.choice(quotes)