--- a/mini_snmpd.c
+++ b/mini_snmpd.c
@@ -90,9 +90,10 @@
 
 static void handle_udp_client(void)
 {
-	struct sockaddr_in sockaddr;
+	struct sockaddr_in6 sockaddr;
 	socklen_t socklen;
 	int rv;
+	char straddr[INET6_ADDRSTRLEN];
 
 	/* Read the whole UDP packet from the socket at once */
 	socklen = sizeof (sockaddr);
@@ -105,8 +106,8 @@
 	}
 	g_udp_client.timestamp = time(NULL);
 	g_udp_client.sockfd = g_udp_sockfd;
-	g_udp_client.addr = sockaddr.sin_addr.s_addr;
-	g_udp_client.port = sockaddr.sin_port;
+	g_udp_client.addr = sockaddr.sin6_addr;
+	g_udp_client.port = sockaddr.sin6_port;
 	g_udp_client.size = rv;
 	g_udp_client.outgoing = 0;
 #ifdef DEBUG
@@ -114,13 +115,14 @@
 #endif
 
 	/* Call the protocol handler which will prepare the response packet */
+	inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
 	if (snmp(&g_udp_client) == -1) {
 		lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		return;
 	} else if (g_udp_client.size == 0) {
 		lprintf(LOG_WARNING, "could not handle packet from UDP client %s:%d: ignored\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		return;
 	}
 	g_udp_client.outgoing = 1;
@@ -128,13 +130,14 @@
 	/* Send the whole UDP packet to the socket at once */
 	rv = sendto(g_udp_sockfd, g_udp_client.packet, g_udp_client.size,
 		MSG_DONTWAIT, (struct sockaddr *)&sockaddr, socklen);
+	inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 	} else if (rv != g_udp_client.size) {
 		lprintf(LOG_WARNING, "could not send packet to UDP client %s:%d: "
-			"only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
-			sockaddr.sin_port, rv, (int) g_udp_client.size);
+			"only %d of %d bytes written\n", straddr,
+			sockaddr.sin6_port, rv, (int) g_udp_client.size);
 	}
 #ifdef DEBUG
 	dump_packet(&g_udp_client);
@@ -143,11 +146,12 @@
 
 static void handle_tcp_connect(void)
 {
-	struct sockaddr_in tmp_sockaddr;
-	struct sockaddr_in sockaddr;
+	struct sockaddr_in6 tmp_sockaddr;
+	struct sockaddr_in6 sockaddr;
 	socklen_t socklen;
 	client_t *client;
 	int rv;
+	char straddr[INET6_ADDRSTRLEN];
 
 	/* Accept the new connection (remember the client's IP address and port) */
 	socklen = sizeof (sockaddr);
@@ -168,10 +172,11 @@
 			lprintf(LOG_ERR, "could not accept TCP connection: internal error");
 			exit(EXIT_SYSCALL);
 		}
-		tmp_sockaddr.sin_addr.s_addr = client->addr;
-		tmp_sockaddr.sin_port = client->port;
+		tmp_sockaddr.sin6_addr = client->addr;
+		tmp_sockaddr.sin6_port = client->port;
+		inet_ntop(AF_INET6, &tmp_sockaddr.sin6_addr, straddr, sizeof(straddr));
 		lprintf(LOG_WARNING, "maximum number of %d clients reached, kicking out %s:%d\n",
-			MAX_NR_CLIENTS, inet_ntoa(tmp_sockaddr.sin_addr), tmp_sockaddr.sin_port);
+			MAX_NR_CLIENTS, straddr, tmp_sockaddr.sin6_port);
 		close(client->sockfd);
 	} else {
 		client = malloc(sizeof (client_t));
@@ -183,35 +188,38 @@
 	}
 
 	/* Now fill out the client control structure values */
+	inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
 	lprintf(LOG_DEBUG, "connected TCP client %s:%d\n",
-		inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+		straddr, sockaddr.sin6_port);
 	client->timestamp = time(NULL);
 	client->sockfd = rv;
-	client->addr = sockaddr.sin_addr.s_addr;
-	client->port = sockaddr.sin_port;
+	client->addr = sockaddr.sin6_addr;
+	client->port = sockaddr.sin6_port;
 	client->size = 0;
 	client->outgoing = 0;
 }
 
 static void handle_tcp_client_write(client_t *client)
 {
-	struct sockaddr_in sockaddr;
+	struct sockaddr_in6 sockaddr;
 	int rv;
+	char straddr[INET6_ADDRSTRLEN];
 
 	/* Send the packet atomically and close socket if that did not work */
-	sockaddr.sin_addr.s_addr = client->addr;
-	sockaddr.sin_port = client->port;
+	sockaddr.sin6_addr = client->addr;
+	sockaddr.sin6_port = client->port;
 	rv = send(client->sockfd, client->packet, client->size, 0);
+	inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
 	} else if (rv != client->size) {
 		lprintf(LOG_WARNING, "could not send packet to TCP client %s:%d: "
-			"only %d of %d bytes written\n", inet_ntoa(sockaddr.sin_addr),
-			sockaddr.sin_port, rv, (int) client->size);
+			"only %d of %d bytes written\n", straddr,
+			sockaddr.sin6_port, rv, (int) client->size);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
@@ -227,23 +235,25 @@
 
 static void handle_tcp_client_read(client_t *client)
 {
-	struct sockaddr_in sockaddr;
+	struct sockaddr_in6 sockaddr;
 	int rv;
+	char straddr[INET6_ADDRSTRLEN];
 
 	/* Read from the socket what arrived and put it into the buffer */
-	sockaddr.sin_addr.s_addr = client->addr;
-	sockaddr.sin_port = client->port;
+	sockaddr.sin6_addr = client->addr;
+	sockaddr.sin6_port = client->port;
 	rv = read(client->sockfd, client->packet + client->size,
 		sizeof (client->packet) - client->size);
+	inet_ntop(AF_INET6, &sockaddr.sin6_addr, straddr, sizeof(straddr));
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not read packet from TCP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
 	} else if (rv == 0) {
 		lprintf(LOG_DEBUG, "disconnected TCP client %s:%d\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
@@ -255,7 +265,7 @@
 	rv = snmp_packet_complete(client);
 	if (rv == -1) {
 		lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
@@ -270,13 +280,13 @@
 	/* Call the protocol handler which will prepare the response packet */
 	if (snmp(client) == -1) {
 		lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: %m\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
 	} else if (client->size == 0) {
 		lprintf(LOG_WARNING, "could not handle packet from TCP client %s:%d: ignored\n",
-			inet_ntoa(sockaddr.sin_addr), sockaddr.sin_port);
+			straddr, sockaddr.sin6_port);
 		close(client->sockfd);
 		client->sockfd = -1;
 		return;
@@ -313,7 +323,7 @@
 	int option_index = 1;
 	int c;
 
-	struct sockaddr_in sockaddr;
+	struct sockaddr_in6 sockaddr;
 	socklen_t socklen;
 	fd_set rfds;
 	fd_set wfds;
@@ -399,14 +409,14 @@
 #endif
 
 	/* Open the server's UDP port and prepare it for listening */
-	g_udp_sockfd = socket(PF_INET, SOCK_DGRAM, 0);
+	g_udp_sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
 	if (g_udp_sockfd == -1) {
 		lprintf(LOG_ERR, "could not create UDP socket: %m\n");
 		exit(EXIT_SYSCALL);
 	}
-	sockaddr.sin_family = AF_INET;
-	sockaddr.sin_port = htons(g_udp_port);
-	sockaddr.sin_addr.s_addr = INADDR_ANY;
+	sockaddr.sin6_family = AF_INET6;
+	sockaddr.sin6_port = htons(g_udp_port);
+	sockaddr.sin6_addr = in6addr_any;
 	socklen = sizeof (sockaddr);
 	if (bind(g_udp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
 		lprintf(LOG_ERR, "could not bind UDP socket to port %d: %m\n", g_udp_port);
@@ -414,7 +424,7 @@
 	}
 
 	/* Open the server's TCP port and prepare it for listening */
-	g_tcp_sockfd = socket(PF_INET, SOCK_STREAM, 0);
+	g_tcp_sockfd = socket(PF_INET6, SOCK_STREAM, 0);
 	if (g_tcp_sockfd == -1) {
 		lprintf(LOG_ERR, "could not create TCP socket: %m\n");
 		exit(EXIT_SYSCALL);
@@ -424,9 +434,9 @@
 		lprintf(LOG_WARNING, "could not set SO_REUSEADDR on TCP socket: %m\n");
 		exit(EXIT_SYSCALL);
 	}
-	sockaddr.sin_family = AF_INET;
-	sockaddr.sin_port = htons(g_tcp_port);
-	sockaddr.sin_addr.s_addr = INADDR_ANY;
+	sockaddr.sin6_family = AF_INET6;
+	sockaddr.sin6_port = htons(g_tcp_port);
+	sockaddr.sin6_addr = in6addr_any;
 	socklen = sizeof (sockaddr);
 	if (bind(g_tcp_sockfd, (struct sockaddr *)&sockaddr, socklen) == -1) {
 		lprintf(LOG_ERR, "could not bind TCP socket to port %d: %m\n", g_tcp_port);
--- a/mini_snmpd.h
+++ b/mini_snmpd.h
@@ -129,7 +129,7 @@
 typedef struct client_s {
 	time_t timestamp;
 	int sockfd;
-	in_addr_t addr;
+	struct in6_addr addr;
 	in_port_t port;
 	unsigned char packet[MAX_PACKET_SIZE];
 	size_t size;
--- a/utils.c
+++ b/utils.c
@@ -91,12 +91,13 @@
 
 void dump_packet(const client_t *client)
 {
-	struct in_addr client_addr;
+	struct in6_addr client_addr;
+	char straddr[INET6_ADDRSTRLEN];
 	char buffer[BUFSIZ];
 	int len;
 	int i;
 
-	client_addr.s_addr = client->addr;
+	client_addr = client->addr;
 	len = 0;
 	for (i = 0; i < client->size; i++) {
 		len += snprintf(buffer + len, sizeof (buffer) - len,
@@ -105,9 +106,10 @@
 			break;
 		}
 	}
+	inet_ntop(AF_INET6, &client_addr, straddr, sizeof(straddr));
 	lprintf(LOG_DEBUG, "%s %u bytes %s %s:%d (%s)\n",
 		client->outgoing ? "transmitted" : "received", (int) client->size,
-		client->outgoing ? "to" : "from", inet_ntoa(client_addr),
+		client->outgoing ? "to" : "from", straddr,
 		ntohs(client->port), buffer);
 }