Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 29.05.2012
Сообщений: 11

консольное приложение winsock (Нарушение прав доступа)

13.06.2012, 12:39. Показов 2583. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разработать консольное приложение, в котором:
1) выполнить инициализацию Winsock;
2) вывести на экран значения специальных IP-адресов INADDR_ANY и INADDR_BROADCAST;
4) выполнить разрешение введенного с клавиатуры имени хоста в IP-адрес;

вот что есть уже. код не очень но пока пытаюсь сделать просто чтобы работало
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
#include "stdafx.h"
#include "winsock2.h"
#include "windows.h"
#include <string.h>
 
#pragma comment(lib, "Ws2_32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    system("chcp 851 > text");
 
    // Initialize Winsock
    int WSAAPI WSAStartup(__in WORD wVersionRequested, __out LPWSADATA lpWSAData);
    int s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
    SOCKADDR_IN sin; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(80); 
    sin.sin_addr.s_addr = INADDR_ANY; //по умолч. 0.0.0.0
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    char *str_addr=inet_ntoa(sin.sin_addr);
    printf("Спец. адрес INADDR_ANY: %s\n",str_addr);
 
    sin.sin_addr.s_addr = INADDR_BROADCAST;
 
    str_addr=inet_ntoa(sin.sin_addr);
    printf("Спец. адрес INADDR_BROADCAST: %s\n",str_addr);
 
    char host[] = "tut.by";
    int no_ipv4=1;
    int countip=0;
    hostent * ipv4 = gethostbyname(host);
    in_addr *address;
    printf("IP:\n");
    for (int i = 0; (address = ((in_addr * )ipv4->h_addr_list[i])) != NULL; i++) { // ВОТ тут ошибка
    // 0xC0000005: Нарушение прав доступа при чтении "0x0000000c".
     printf("\t%s\n", inet_ntoa(* address));
     countip++;
    }
 
    WSACleanup();// выгружаем WinSock    hostent * ipv4 = gethostbyname(host); 
// gethostbyname(host)  CXX0017: ошибка: не найден символ "gethostbyname" если просмотреть значение "gethostbyname(host)"    
    system("pause");
    return 0;
}
судя по отладчику проблемы начинаются уже тут
если посмотреть значение gethostbyname(host) то отладчик ругается но проходит дальше
gethostbyname(host) CXX0017: ошибка: не найден символ "gethostbyname"


и еще может кто поможет по этим пунктам

3) определить номера портов, используемых стандартными службами ftp, telnet, smtp, http, pop3;
5) по IP-адресу узла, заданному в десятично-точечной нотации, определить его имя;
6) преобразовать IP-адрес и номер порта к сетевому порядку следования байтов, вывести на экран значения до и после преобразования в 16-ричном формате
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.06.2012, 12:39
Ответы с готовыми решениями:

Chat_Server. Ошибка 0xC0000005: нарушение прав доступа при чтении
ребят помогите пишу серверную часть чата по сети на C++ Выдает ошибку: Необработанное исключение по адресу 0x000B13CA в...

Нарушение прав доступа
Помогите пожалуйста. Пишу программу на С++. У меня есть класс, в конструкторе этого класса выделяется память для двумерного массива, и идет...

Нарушение прав доступа
Выдает вот это Необработанное исключение в &quot;0x000d1e05&quot; в &quot;зпр3.exe&quot;: 0xC0000005: Нарушение прав доступа при чтении...

2
 Аватар для soft.creator
106 / 106 / 11
Регистрация: 17.10.2010
Сообщений: 283
13.06.2012, 13:29
Ээээээ... Здесь надо было не прототип написать,
C++
1
int WSAAPI WSAStartup(__in WORD wVersionRequested, __out LPWSADATA lpWSAData);
а функцию вызвать!
C++
1
2
WSADATA data;
WSAStartup(MAKEWORD(2, 0), &data);
Именно поэтому в ipv4 функция gethostbyname вернула NULL, что при обращении к
C++
1
ipv4->h_addr_list[i]
выдало ошибку доступа к нулевому адресу. Кстати, такие вещи надо проверять, т.к. NULL также возращается, если хост не найден
1
0 / 0 / 1
Регистрация: 29.05.2012
Сообщений: 11
13.06.2012, 17:01  [ТС]
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
// lab4_1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "winsock2.h"
#include "windows.h"
 
#pragma comment(lib, "Ws2_32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    // Initialize Winsock
    WSADATA data;
    WSAStartup(MAKEWORD(2, 0), &data);
 
    int s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
    SOCKADDR_IN sin; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(80); 
    sin.sin_addr.s_addr = INADDR_ANY; //по умолч. 0.0.0.0
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    char *str_addr=inet_ntoa(sin.sin_addr);
    printf("INADDR_ANY: %s\n",str_addr);
 
    sin.sin_addr.s_addr = INADDR_BROADCAST;
 
    str_addr=inet_ntoa(sin.sin_addr);
    printf("INADDR_BROADCAST: %s\n",str_addr);
 
    char host[] = "tut.by";
    int countip=0;
    hostent * ipv4 = gethostbyname(host);
    in_addr *address;
    printf("IP:\n");
    for (int i = 0; (address = ((in_addr * )ipv4->h_addr_list[i])) != NULL; i++) { 
     printf("\t%s\n", inet_ntoa(* address));
     countip++;
    }
 
    hostent* hn;
    DWORD a = inet_addr ("127.0.0.1"); // Адрес машины в сетевом формате
    hn = gethostbyaddr ((char* )&a, 4, AF_INET);
    printf("Host name: %s\n", hn->h_name);
 
    struct servent* str = getservbyname(host, "tcp"); //!!
    printf("Port: %s\n", str->s_port);
 
    WSACleanup();// выгружаем WinSock
    system("pause");
    return 0;
}
вот тут теперь заикается (строка 47) "struct servent* str = getservbyname(host, "tcp");"
Нарушение прав доступа при чтении "0x00000008

Добавлено через 22 минуты
C++
1
2
3
    struct servent *str; 
    str = getservbyname("http", NULL);
    printf("Port: %d \n", str->s_port);
разобрался с этим пунктом

Добавлено через 1 час 3 минуты
Может кому надо будет. Программа делалась, чтобы запустить её один раз для учебного процесса. Поэтому код выглядит не очень мягко говоря.
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
72
// lab4_1.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "winsock2.h"
#include "windows.h"
#include <iostream>
 
#pragma comment(lib, "Ws2_32.lib")
 
int _tmain(int argc, _TCHAR* argv[])
{
    // Initialize Winsock
    WSADATA data;
    WSAStartup(MAKEWORD(2, 0), &data);
 
    int s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
    SOCKADDR_IN sin; 
    sin.sin_family = AF_INET; 
    sin.sin_port = htons(80); 
    sin.sin_addr.s_addr = INADDR_ANY; //по умолч. 0.0.0.0
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    char *str_addr=inet_ntoa(sin.sin_addr);
    printf("INADDR_ANY: %s\n",str_addr);
 
    sin.sin_addr.s_addr = INADDR_BROADCAST;
 
    str_addr=inet_ntoa(sin.sin_addr);
    printf("INADDR_BROADCAST: %s\n",str_addr);
 
    char host[] = "www.tut.by";
    int countip=0;
    hostent * ipv4 = gethostbyname(host);
    in_addr *address;
    printf("IP:\n");
    for (int i = 0; (address = ((in_addr * )ipv4->h_addr_list[i])) != NULL; i++) { 
     printf("\t%s\n", inet_ntoa(* address));
     countip++;
    }
 
    hostent* hn;
    DWORD a = inet_addr ("127.0.0.1"); // Адрес машины в сетевом формате
    hn = gethostbyaddr ((char* )&a, 4, AF_INET);
    printf("Host name: %s\n", hn->h_name);
 
    struct servent *str; 
    str = getservbyname("http", NULL);
    printf("Port http: %d \n", str->s_port);
    str = getservbyname("ftp", NULL);
    printf("Port ftp: %d \n", str->s_port);
    str = getservbyname("telnet", NULL);
    printf("Port telnet: %d \n", str->s_port);
    str = getservbyname("pop3", NULL);
    printf("Port pop3: %d \n", str->s_port);
    str = getservbyname("smtp", NULL);
    printf("Port smtp: %d \n", str->s_port);
 
    a = htonl(a); //"127.0.0.1"
    std::cout << "IP 16: " << std::hex << a << "\n";
 
    int str1;
    str1 = str->s_port; //Port smtp
 
    str1 = htons(str1);
    std::cout << "PORT 16: "<< std::hex << str1 << "\n";
 
    WSACleanup();// выгружаем WinSock
    system("pause");
    return 0;
}
Добавлено через 32 секунды
Разработать консольное приложение, в котором:
1) выполнить инициализацию Winsock;
2) вывести на экран значения специальных IP-адресов INADDR_ANY и INADDR_BROADCAST;
3) определить номера портов, используемых стандартными службами ftp, telnet, smtp, http, pop3;
4) выполнить разрешение введенного с клавиатуры имени хоста в IP-адрес;
5) по IP-адресу узла, заданному в десятично-точечной нотации, определить его имя;
6) преобразовать IP-адрес и номер порта к сетевому порядку следования байтов, вывести на экран значения до и после преобразования в 16-ричном формате.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2012, 17:01
Помогаю со студенческими работами здесь

Нарушение прав доступа
Добрый день, сразу извиняюсь что пишу в связи столь распространенной ошибкой сюда, знаю что нарушение прав доступа происходит тогда, когда...

Нарушение прав доступа
// ConsoleApplication1.cpp: определяет точку входа для консольного приложения. //get - seletor, set - modificator, show - вывод ...

Нарушение прав доступа
Доброго времени суток, уважаемые программисты! Вкратце: шефом была поставлена задача выяснить остатки витой пары на складе... Однако...

Странное нарушение прав доступа
Программа выдает странные сообщения о нарушении прав доступа при чтении. Ошибка возникает в случайные моменты времени и сильно портит...

Очередное нарушение прав доступа
Создал класс с именем Numbers. Ниже реализация функции void Numbers::itoc(long int integer, char* ch) { long int summa; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru