networking · beginner · ~15 min
Cast generic socket addresses and convert network byte order integers into host IP and port representations.
BSD socket network programs receive generic struct sockaddr pointers that must be inspected for address family (AF_INET), cast to struct sockaddr_in, and converted to human-readable IP strings.
Implement:
#include <netinet/in.h>
int extract_ipv4_and_port(const struct sockaddr *addr, char *ip_buf, size_t ip_cap, uint16_t *out_port);
addr == NULL, ip_buf == NULL, out_port == NULL, or ip_cap < 16, return -1.addr->sa_family == AF_INET. If not IPv4, return -1.addr to const struct sockaddr_in *.ntohs(sin->sin_port) and write to *out_port.sin->sin_addr.s_addr to dotted-decimal format ("A.B.C.D") into ip_buf.0 on success.struct sockaddr_in sin = {0};
sin.sin_family = AF_INET;
sin.sin_port = htons(8080);
sin.sin_addr.s_addr = htonl(0x7F000001); // 127.0.0.1
char ip[16]; uint16_t port;
extract_ipv4_and_port((struct sockaddr *)&sin, ip, sizeof(ip), &port); // ip=="127.0.0.1", port==8080
addr: generic sockaddr pointer; ip_buf: buffer of at least 16 bytes; out_port: uint16_t pointer.
Returns 0 on success, or -1 on non-AF_INET or NULL args.
Must use ntohs and extract 4 octets. Buffer must be >= 16.
#include <stddef.h>
#include <stdint.h>
#include <netinet/in.h>
int extract_ipv4_and_port(const struct sockaddr *addr, char *ip_buf, size_t ip_cap, uint16_t *out_port) {
(void)addr; (void)ip_buf; (void)ip_cap; (void)out_port;
return -1;
}
Forgetting ntohs on port; insufficient buffer capacity; buffer overrun on snprintf.
AF_INET6 or other family returns -1; 0.0.0.0 and 255.255.255.255 formatted accurately.
Solve this exercise in the browser editor — compile and run against the test harness, no setup required.