Quote of the Day (QOTD) Protocol


Reading time: about 2 minutes

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 RFC865. According to the RFC, a QOTD server is run on port 17 for TCP and UDP connections. It is an excellent protocol to learn the socket API and to write your first server.

Protocol details

The RFC is quite short, actually it is just half a page. Therefore, it is highly recommended to read it. But the protocol details are also written below in an easy-to-understand manner.

Recommendations

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

  1. Listen to connections on port 17.
  2. Accept a connection.
  3. Choose a random quote.
  4. Send the quote to the client.
  5. 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

Despite being almost extinct, the following servers have been reported to work.

Server Address TCP Port UDP Port
djxmmx.net 17 17
wreeper.top 17 N/A

These servers used to work, but they don’t anymore. I’m keeping them here to occasionally check if they are back online, and put them back on the list if they are.

Server Address TCP Port UDP Port
alpha.mike-r.com 17 17
cygnus-x.net 17 17

Code examples

Since the protocol is very simple and completely one-way, it is easy to write your own QOTD server and QOTD client.

QOTD server in Python

Below is the code for a simple, single-threaded QOTD server written in Python. On each connection, it picks a random quote from the quotes list and sends it to the client. It should be an easy exercise to read the quotes from a file or a database.

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 = random.choice(quotes)
    sock.send(quote.encode() + b"\n")
    sock.close()

QOTD client in Python

import socket

addr = ("example.com", 17) # Change server address

conn = socket.create_connection(addr)
quote = conn.recv(4096) # Read up to 4096 bytes

print(quote.decode("utf-8"))

Citation

If you find this work useful, please cite it as:
@article{yaltirakliqotdprotocol,
  title   = "Quote of the Day (QOTD) Protocol",
  author  = "Yaltirakli, Gokberk",
  journal = "gkbrk.com",
  year    = "2024",
  url     = "https://www.gkbrk.com/qotd-protocol"
}
Not using BibTeX? Click here for more citation styles.
IEEE Citation
Gokberk Yaltirakli, "Quote of the Day (QOTD) Protocol", October, 2024. [Online]. Available: https://www.gkbrk.com/qotd-protocol. [Accessed Oct. 10, 2024].
APA Style
Yaltirakli, G. (2024, October 10). Quote of the Day (QOTD) Protocol. https://www.gkbrk.com/qotd-protocol
Bluebook Style
Gokberk Yaltirakli, Quote of the Day (QOTD) Protocol, GKBRK.COM (Oct. 10, 2024), https://www.gkbrk.com/qotd-protocol

Comments

Comment by Guest
2024-05-27 at 13:05
Spam probability: 8.167%

hi

Comment by admin
2024-01-24 at 11:52
Spam probability: 0.393%

Hey wreeper, Thanks for keeping this alive and setting up another server, I now added yours to the list. While I was adding your new server, I also checked the existing ones I had there, and it seems two of them are now gone. :( Perhaps I should set up my own QOTD server as well, just to have some more variety in the list.

Comment by someone
2024-01-24 at 08:50
Spam probability: 0.945%

Hi, i started running a random quote server (although for my own quotes). The DNS is wreeper.top

Comment by Will
2023-01-25 at 13:37
Spam probability: 0.299%

Running the server on macOS with python3 (version 3.10.8 used in my testing) gives the error: Traceback (most recent call last): File "/Users/gamble05/qotd.py", line 17, in <module> sock.send(f"{quote}\n") TypeError: a bytes-like object is required, not 'str' when making a connection using `nc localhost 17` This can be fixed by replacing: quote = random.choice(quotes) sock.send(f"{quote}\n") with: quote = random.choice(quotes)+"\n" sock.send(bytes(quote, 'utf-8'))

Comment by Guest
2022-07-27 at 10:48
Spam probability: 8.321%

I'm sorry whats this website for? djxmmx.net

Comment by Guest
2022-06-20 at 07:47
Spam probability: 5.013%

djxmmx.net still works :)

Comment by Guest
2022-01-07 at 06:04
Spam probability: 5.215%

Hello from 2021

Comment by admin
2019-05-31 at 11:29
Spam probability: 0.219%

The client can be anything that connects to a socket and reads data from it. Netcat is a great example. nc IP 17

Comment by David
2019-05-30 at 14:56
Spam probability: 2.599%

Where is the client?

Comment by Bart
2019-02-08 at 13:13
Spam probability: 7.409%

Nice protocol

Comment by Simon
2018-09-13 at 12:50
Spam probability: 4.303%

Thank you!

© 2024 Gokberk Yaltirakli