Select

Select returns the file descriptors ready for reading

fd_set fds;
FD_ZERO(&fds);
FD_SET(fd1, &fds);
FD_SET(fd2, &fds)

// numfd: Maximum fd number + 1
int numfd = max(fd1, fd2) + 1

// int select(numfd, read_fds, write_fds, error_fds, timeout)
if (select(numfd, &fds, NULL, NULL, NULL) != 1) err("select");

// Check if the fds are ready
if (FD_ISSET(fd1, &fds)) {
	// Is ready
}

Sockets

Stream Sockets (TCP): Guarantee that requests are in-order and no loss

Port Numbers

Server-Side

// int socket(AF_INET, type, protocol)
int soc = socket(AF_INET, SOCK_STREAM, 0);
if (soc == -1) err("socket");

// Create an address
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(54321); // Host-TO-Network-Short: Convert integer to network byte order
addr.sin_addr.s_addr = INADDR_ANY;
memset(&(addr.sin_zero), 0, 8); // set remaining bits to 0

// Bind to an address
// int bind(socket, struct socaddr, socklen)
if (bind(soc, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) == -1) err("bind");

// Listen to socket (backlog is the max number of pending connections)
// int listen(socket, backlog)
if (listen(soc, 1024) < 0) err("listen");

// Accept new connections (blocking!)
// int accept(socket, struct* socaddr client_addr, socklen)
struct sockaddr_in client_addr;
client_addr.sin_family = AF_INET;
unsigned int client_len = sizeof(struct sockaddr_in)

int client_fd = accept(soc, (struct sockaddr *) &client_addr, &client_len);

// Write to the client (network newline: \\r\\n)
write(client_fd, "Meow~\\r\\n", 7);
close(client_fd);

Client-Side

int soc = socket(AF_INET, SOCK_STREAM, 0);

// DNS Lookup (Remember to free!)
// int getaddrinfo(char* host, char* service, struct addrinfo *hints, struct addrinfo **result)
struct addrinfo *result;
getaddrinfo("localhost", NULL, NULL,&result);

// Set server address
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(54321);
server.sin_addr = ((struct sockaddr_in *) result->ai_addr).sin_addr;
memset(&server.sin_zero, 0, 8);

// Free
freeaddrinfo(result);

// Connect to the server
if (connect(soc, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) != 0) err("connect");

// Read from the socket
char buf[10];
read(soc, buf, 7); // Returns how many bytes are read
buf[7] = "\\0";
close(soc);