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
}
Stream Sockets (TCP): Guarantee that requests are in-order and no loss
Port Numbers
// 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);
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);