CS 105

Networking Practice Questions

Consider this simple network server program that listens for incoming connections on port 12345 and issues a new ticket number to each client that connects.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

size_t ticket_number = 0;

void issue_ticket(int client_socket) {
    char buffer[100];
    snprintf(buffer, sizeof(buffer), "Your ticket number is %zu\n", 
             ticket_number++);
    send(client_socket, buffer, strlen(buffer), 0);
    close(client_socket);
}

int main() {
    struct sockaddr_in server_addr;
    int server_socket = socket(PF_INET, SOCK_STREAM, 0);
    // Set up the server socket
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(12345);
    bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
    listen(server_socket, 5);

    while (1) {
        int client_socket = accept(server_socket, NULL, NULL);
        issue_ticket(client_socket);
    }

    return 0;
}

What does accept do in this code? What does it return, and how is that return value used?

Often in a network server, there are multiple clients that might want to connect at the same time, and network servers often use fork() or pthread_create() to handle multiple clients concurrently. Would this approach improve the efficiency of this server? Why or why not? Would one of these approaches be fatally flawed for this server?

(When logged in, completion status appears here.)