в результате имею:
192.168.1.1   192.168.1.1
192.168.1.2   192.168.1.2
192.168.1.30   192.168.1.30
192.168.1.4   192.168.1.4
192.168.1.5   192.168.1.5
192.168.1.40   192.168.1.40
255.255.255.255   255.255.255.255
Если я правильно понял, то ты ожидаешь увидеть на экране:
192.168.1.1   255.255.255.0
192.168.1.2   255.255.255.0
192.168.1.30   255.255.255.0
192.168.1.4   255.255.255.0
192.168.1.5   255.255.255.0
192.168.1.40   255.255.255.0
192.168.1.70   255.255.255.0
Если да, то проблема в том, что inet_ntoa возвращает указатель на внутренний статический буфер, поэтому строка
cout << inet_ntoa(sa1) << "   " << inet_ntoa(sa2) << "\n";
дает ошибку. То есть результат первого вызова inet_ntoa сразу же затирается результатом второго вызова.
Нужно так:
cout << inet_ntoa(sa1) << "   ";
cout << inet_ntoa(sa2) << endl;