Одной из проблем может быть то, что вы неправильно извлекаете IP-заголовок из пакета. В начале буфера обычно находится заголовок Ethe rnet, а затем IP-заголовок, поэтому для получения IP-заголовка необходимо:
struct iphdr *iph = (struct iphdr*)(buf + sizeof(struct ethhdr));
Надеюсь, это помогло в вашем случае Вот также хороший гид
Редактировать
Вы правы, это не было реальной проблемой в вашем случае. Я попробовал это сам и также получил только адрес.
После некоторых исследований я думаю, что настоящая причина в том, что эти строки специального формата, такие как %pI4
, известны только в реализации этих функций ядром, а не реализацией stdlib. Так что эта попытка будет работать только при разработке модуля ядра, например