Форум программистов, компьютерный форум CyberForum.ru

Адрес первого и последнего хоста в сети - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
alexyoung
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 6
09.07.2010, 15:53     Адрес первого и последнего хоста в сети #1
Собсно, из файла читается ip\mask. Нужно вывести имя первого и последнего хоста сети.
Код написал но где - то ошибка, скорее всего логическая. Если не сложно прошу помочь ее найти.
Заранее благодарен.
Код :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
 
#include <iostream>
#include <cstdlib>
#include <math.h>
 
using namespace std;
 
int main()
{
FILE *f;
char *in = "in.dat";
int a[4],u[32],w[4], k, m, i, j, q, g, x, t = 0;
 
    f = fopen( in, "r" );
    fscanf(f, "%d.%d.%d.%d/%d", &a[3], &a[2], &a[1], &a[0], &m);
    fclose( f );
 
    for (j = 0; j < 32 ; j++)                 //обнуление
        u[j] = 0;
 
 
 
    for ( i = 0; i <= 3; i++)           //перевод в двоичную
    {
        while ( a[i] != 0 )
        {
            u[31-t] = a[i] % 2;
            a[i]/=2;
            
            t++;
        }
        t = 8 * pow (2,i) + 1;
    }
 
    k = 32 - m;
 
    for ( j = k+1; j <= 31; j++)            //первое число
        u[j] = 0;
 
    for( q = 0; q <= 3; q++)            //перевод в десятичную*
    {   
        for ( j = g, x = 7; x > -1 ;  x--)
        {
            w[q] = u[j] * pow( 2, x);
            g++;
        }
        printf("%d.", w[q]);
    }
    printf("\n");
 
 
    for ( j = k+1; j <= 31; j++)            //вторео число
        u[j] = 1; 
 
    for( q = 0; q <= 3; q++)            //*
    {   
        for ( j = g, x = 7; x > -1 ;  x--)
        {
            w[q] = u[j] * pow( 2, x);
            g++;
        }
        printf("%d.", w[q]);
    }
    printf("\n");
 
  return EXIT_SUCCESS;
 
}
Работаю под никсой. Выдает ошибку сегментирования.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5754 / 3403 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
09.07.2010, 16:45     Адрес первого и последнего хоста в сети #2
Переменная g использована без предварительной инициализации.
alexyoung
0 / 0 / 0
Регистрация: 25.06.2010
Сообщений: 6
09.07.2010, 16:59  [ТС]     Адрес первого и последнего хоста в сети #3
Точно!Спасибо!(Тока работает все равно не верно))
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.07.2010, 18:24     Адрес первого и последнего хоста в сети #4
alexyoung, каким-то Вы непростым путём идёте...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
 
int main(void){
    struct in_addr net, mask;
    in_addr_t first, brd, last;
    char buf[BUFSIZ], *p;
 
    printf("Net address: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        perror("fgets");
        exit(EXIT_FAILURE);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf )
        exit(EXIT_FAILURE);
    memset(&net, 0, sizeof(struct in_addr));
    if ( ! inet_aton(buf, &net) ){
        perror("inet_aton");
        exit(EXIT_FAILURE);
    }
 
    printf("Mask: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        perror("fgets");
        exit(EXIT_FAILURE);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf )
        exit(EXIT_FAILURE);
    memset(&mask, 0, sizeof(struct in_addr));
    if ( ! inet_aton(buf, &mask) ){
        perror("inet_aton");
        exit(EXIT_FAILURE);
    }
 
    first = net.s_addr + 1;
    brd = net.s_addr + ~mask.s_addr;
    last = brd - 1;
 
    net.s_addr = first;
    printf("First host: %s\n", inet_ntoa(net));
    net.s_addr = last;
    printf("Last host: %s\n", inet_ntoa(net));
    net.s_addr = brd;
    printf("Broadcast address: %s\n", inet_ntoa(net));
 
    exit(EXIT_SUCCESS);
}
Адрес первого и последнего хоста в сети
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
09.07.2010, 23:19     Адрес первого и последнего хоста в сети #5
sed/Broadcast addres/Broadcast address/g;
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2010, 00:34     Адрес первого и последнего хоста в сети #6
odip, ну да, только у меня там ещё "Net addres" было, так, что
sed /addres/address/g

Добавлено через 16 минут
Кстати, серьёзнее косяк нашёл - это на маке всё работало - там порядок байтов с сетевым совпадает.
вот поправленная
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
 
int main(void){
    struct in_addr net, mask;
    in_addr_t first, brd, last;
    char buf[BUFSIZ], *p;
 
    printf("Net address: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        perror("fgets");
        exit(EXIT_FAILURE);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf )
        exit(EXIT_FAILURE);
    memset(&net, 0, sizeof(struct in_addr));
    if ( ! inet_aton(buf, &net) ){
        perror("inet_aton");
        exit(EXIT_FAILURE);
    }
 
    printf("Mask: ");
    if ( ! fgets(buf, BUFSIZ, stdin) ){
        perror("fgets");
        exit(EXIT_FAILURE);
    }
    if ( p = strrchr(buf, '\n') )
        *p = '\0';
    if ( ! *buf )
        exit(EXIT_FAILURE);
    memset(&mask, 0, sizeof(struct in_addr));
    if ( ! inet_aton(buf, &mask) ){
        perror("inet_aton");
        exit(EXIT_FAILURE);
    }
 
    first = htonl(net.s_addr) + 1;
    brd = htonl(net.s_addr) + ~htonl(mask.s_addr);
    last = brd - 1;
 
    net.s_addr = ntohl(first);
    printf("First host: %s\n", inet_ntoa(net));
    net.s_addr = ntohl(last);
    printf("Last host: %s\n", inet_ntoa(net));
    net.s_addr = ntohl(brd);
    printf("Broadcast address: %s\n", inet_ntoa(net));
 
    exit(EXIT_SUCCESS);
}
Yandex
Объявления
10.07.2010, 00:34     Адрес первого и последнего хоста в сети
Ответ Создать тему
Опции темы

Текущее время: 16:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru