networking · beginner · ~15 min

Sockaddr IPv4 & Port Extractor

Cast generic socket addresses and convert network byte order integers into host IP and port representations.

Challenge

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.

Your Task

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);

Rules

  1. If addr == NULL, ip_buf == NULL, out_port == NULL, or ip_cap < 16, return -1.
  2. Verify addr->sa_family == AF_INET. If not IPv4, return -1.
  3. Cast addr to const struct sockaddr_in *.
  4. Extract port using ntohs(sin->sin_port) and write to *out_port.
  5. Convert sin->sin_addr.s_addr to dotted-decimal format ("A.B.C.D") into ip_buf.
  6. Return 0 on success.

Example

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

Input format

addr: generic sockaddr pointer; ip_buf: buffer of at least 16 bytes; out_port: uint16_t pointer.

Output format

Returns 0 on success, or -1 on non-AF_INET or NULL args.

Constraints

Must use ntohs and extract 4 octets. Buffer must be >= 16.

Starter code

#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;
}

Common mistakes

Forgetting ntohs on port; insufficient buffer capacity; buffer overrun on snprintf.

Edge cases to handle

AF_INET6 or other family returns -1; 0.0.0.0 and 255.255.255.255 formatted accurately.

Background lessons

Solve this exercise in the browser editor — compile and run against the test harness, no setup required.