#include #include #include "Practical.h" #include "ch4_common.h" int main(int argc, char **argv) { if (argc != 2) { DieWithUserMessage("Parameter(s)", "ai_family, serv_addr->ai_socktype, serv_addr->ai_protocol ); if (sock < 0) { DieWithSystemMessage("socket() failed"); } if (bind(sock, serv_addr->ai_addr, serv_addr->ai_addrlen) < 0) { DieWithSystemMessage("bind() failed"); } fputs("Listening on ", stdout); PrintSocketAddress(serv_addr->ai_addr, stdout); fputc('\n', stdout); freeaddrinfo(serv_addr); while (true) { struct sockaddr_storage client_addr; socklen_t client_addr_len = sizeof(client_addr); char buf[MAXSTRINGLENGTH]; const ssize_t num_bytes_recvd = recvfrom( sock, buf, MAXSTRINGLENGTH, 0, (struct sockaddr *) &client_addr, &client_addr_len ); if (num_bytes_recvd < 0) { DieWithSystemMessage("recvfrom() failed"); } fputs("Handling client ", stdout); PrintSocketAddress((struct sockaddr *) &client_addr, stdout); fputc('\n', stdout); const ssize_t num_bytes_sent = sendto( sock, buf, num_bytes_recvd, 0, (struct sockaddr *) &client_addr, client_addr_len ); if (num_bytes_sent < 0) { DieWithSystemMessage("sendto() failed"); } else if (num_bytes_sent != num_bytes_recvd) { DieWithUserMessage("sendto()", "sent unexpected number of bytes"); } } }