Top.Mail.Ru
Ответы

Программа на языке си

Мы вводим в командную строку ip адрес и маску подсети(Значение маски может быть в 16 виде ,в 8 виде, в 2 виде в зависимости от аргументов командной строки) .Вывести номер сети и номер узла.Пожалуйста помогите! Заранее благодарен.

Дополнен

Неправильно записал задание. Нужно вывести номер сети, номер узла, и маску в 2,10,16 видах.

По дате
По рейтингу
Аватар пользователя
Новичок

Есть стандартные функции для преобразования адресов IPv4, программа ниже использует их. В руководстве сказано: "components of the dotted address can be specified in decimal, octal (with a leading 0), or hexadecimal, with a leading 0X)"
Пример работы:

12345
 ./app 127.0.0.1 255.0.0.0 
ip:        127.0.0.1 
mask:      255.0.0.0 
host addr: 0.0.0.1 
net addr:  127.0.0.0  

Исходный код:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
 #include <stdio.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 
 
int main( int argc, char* argv[] ) 
{ 
    //  IP адрес и маска сети, которые вводит пользователь 
    struct  in_addr ip; 
    struct  in_addr mask; 
    //  Адрес хоста внутри сети 
    struct  in_addr host_addr; 
    //  Адрес сети 
    struct  in_addr net_addr; 
 
    if( argc > 2) 
    { 
        if( inet_aton(argv[1], &ip) ) 
        { 
            if( inet_aton(argv[2], &mask) ) 
            { 
                //  Успешный ввод 
                printf("ip:        %s\n", inet_ntoa(ip)); 
                printf("mask:      %s\n", inet_ntoa(mask)); 
                //  Вычислим адрес хоста и адрес сети 
                host_addr.s_addr = ip.s_addr & ~mask.s_addr; 
                printf("host addr: %s\n",inet_ntoa(host_addr)); 
                net_addr.s_addr = ip.s_addr & mask.s_addr; 
                printf("net addr:  %s\n",inet_ntoa(net_addr)); 
            } 
            else 
            { 
                fprintf( stderr, "Ошибка разбора маски сети\n" ); 
            } 
        } 
        else 
        { 
            fprintf( stderr, "Ошибка разбора IP адреса\n" ); 
        } 
    } 
    else 
    { 
        printf("Использование:\n"); 
        printf("%s IPv4_address IPv4_netmask\n", argv[0]); 
    } 
    return  0; 
}