Tutorial 2: A Simple TCP Server
Adapted from Spectranet: Tutorial 2.
The first practical network program is a TCP server that accepts one connection and exchanges simple text. It can be tested from another computer with telnet or nc.
Server flow
A TCP server normally performs these steps:
- open a socket
- bind the socket to a local port
- put the socket into listening mode
- accept an incoming connection
- send and receive data on the accepted socket
- close the accepted socket when finished
The original listening socket remains available for future connections; the accepted socket is the one used for the actual data transfer.
Opening the socket
In assembly, a TCP socket is opened by passing SOCK_STREAM and calling the SOCKET routine through HLCALL:
ld c, SOCK_STREAM
ld hl, SOCKET
call HLCALL
jr c, .error
ld (v_sockfd), a
In C, the same operation is:
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Errors are reported with carry set in assembly, or with a negative return value in C.
Binding and listening
The server binds the socket to the port it wants to receive connections on, then calls listen. In the tutorial example, port 2000 is used so a PC can connect with:
telnet 172.16.0.38 2000
After accept returns, the program sends a greeting, reads text sent by the remote side, and exits when the input begins with x.
Closing sockets
Sockets are limited hardware resources. Programs should close accepted sockets and listening sockets when finished. Reset clears socket state, but programs should not rely on reset as normal cleanup.