Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
InCode
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 8
1

Ошибка после функции bind

09.09.2015, 10:51. Просмотров 522. Ответов 2
Метки нет (Все метки)

Пытаюсь первый раз написать по книге клиент-сервер. В этом практически ничего не понимаю.
Во время компиляции нет предупреждений и ошибок. Ошибки появляются во время работы.
Сначала запускаю сервер и он всегда показывает ошибку
Mistake of the call bind: No error
Для продолжения нажмите любую клавишу . . .

Как это можно исправить? Заранее спасибо

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
// Клиент
 
#include <WinSock2.h>
#include <stdio.h>
 
#pragma comment(lib, "WSock32.Lib")
 
 
int main()
{
    SOCKET              s;              // Дескриптор сокета
    sockaddr_in         peer;           // Адрес удаленного хоста
    int                 rc;             // Возвращаемое значение различных функций
    char                buf[1];         // 
 
 
    peer.sin_family         = AF_INET;                  //
    peer.sin_port           = htons(7500);              // номер порта
    peer.sin_addr.s_addr    = inet_addr("127.0.0.1");   // возвратный адрес
 
 
    // Получение сокета для логического соединения
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0)
    {
        perror("Mistake of the call socket");
        system("pause");
        exit(1);
    }
 
 
    // Установление соединения с сервером
    rc = connect(s, (sockaddr*)&peer, sizeof(peer));
    if (rc)
    {
        perror("Mistake of the call connect");
        system("pause");
        exit(1);
    }
 
 
    // Отправка серверу одного байта
    rc = send(s, "1", 1, 0);
    if (rc <= 0)
    {
        perror("Mistake of the call send");
        system("pause");
        exit(1);
    }
    
 
    // Чтение из сокета одного байта
    rc = recv(s, buf, 1, 0);
    if (rc <= 0)
    {
        perror("Mistake of the call recv");
        system("pause");
    }
    else
        printf("%c\n", buf[0]);
 
 
    system("pause");
    return 0;
}

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Сервер
 
#include <WinSock2.h>
#include <stdio.h>
 
#pragma comment(lib, "WSock32.Lib")
 
 
int main()
{
    sockaddr_in         local;
    SOCKET              s;              // Дескриптор сокета
    SOCKET              s1;
    int                 rc;             // Возвращаемое значение различных функций
    char                buf[1];         // 
 
 
    // Заполнение адресной структуры
    local.sin_family        = AF_INET;
    local.sin_port          = htons(7500);  // номер порта
    local.sin_addr.s_addr   = htonl(INADDR_ANY);
 
 
    // Получение сокета для логического соединения
    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s < 0)
    {
        perror("Mistake of the call socket");
        system("pause");
        exit(1);
    }
 
    
    // Привязка адреса интерфейса и номер порта к прослушивающему сокету
    rc = bind(s, (sockaddr*)&local, sizeof(local));
    if (rc < 0)     // Тут постоянно ошибка
    {
        perror("Mistake of the call bind");
        system("pause");
        exit(1);
    }
 
 
    // Перевести сокет в режим прослушивания входящих соединений
    // (пометим сокет как прослушивающий)
    rc = listen(s, 5);
    if (rc)
    {
        perror("Mistake of the call listen");
        system("pause");
        exit(1);
    }
 
 
    // Прием соединений, ожидающего во входной очереди
    // accept() блокирует выполнение программы до тех пор, пока не поступит запрос на соединение
    s1 = accept(s, NULL, NULL);
    if (s1 < 0)
    {
        perror("Mistake of the call accept");
        system("pause");
        exit(1);
    }
 
 
    // Чтение из сокета одного байта
    rc = recv(s1, buf, 1, 0);
    if (rc <= 0)
    {
        perror("Mistake of the call recv");
        system("pause");
        exit(1);
    }
 
 
    printf("%c\n", buf[0]);
 
    
    // Отправка одного байта клиенту
    rc = send(s1, "2", 1, 0);
    if (rc <= 0)
        perror("Mistake of the call send");
 
 
    system("pause");
    return 0;
}
Добавлено через 11 минут
Ошибка в нижнем листинге в 35 строке сразу после bind
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2015, 10:51
Ответы с готовыми решениями:

WinSock выдает ошибку при вызове функции bind
исходный код (взять ОТСЮДА почти полностью, &quot;пример реализации TCP сервера&quot;) ...

Как правильно перекомпилировать под windows функции connect, accept, bind?
компилятор пишет ошибку &quot;переопределение. другая кмпоновка&quot; смотрю про...

Освобождение памяти после std:bind
Что имею: - CentOS - gcc 4.8 - valgrind Что делаю - С помощью...

Почему если я задаю IP 127.0.0.1 то bind возвращает 0, а если задаю IP в сети, то bind возвращает -1
IP узнаю через 2IP.ru вот и если задаю полученный IP, то программа вылатает...

Повторный bind
Всем доброго времени суток. С сетями разбираюсь недавно и столкнулся с...

2
zealot01
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
Завершенные тесты: 1
09.09.2015, 13:55 2
1 Для работы с сокетами в винде нужно вызывать WSAStartup в начале и WSACleanup в конце.
2 Для чтения кодов ошибок используется WSAGetLastError.
1
InCode
2 / 2 / 0
Регистрация: 09.09.2015
Сообщений: 8
10.09.2015, 05:33  [ТС] 3
Читаю Эффективное программирование на TCP-IP, автор Йон Снейдер. И в этой книге ничего не сказано про WSAStartup и WSACleanup. Даже не представляю для чего нужны эти функции.
В соседней теме Echo-сервер скопировал ту часть, где вызываются эти функции и всё заработало!

Благодарю
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2015, 05:33

Код ошибки bind (socket)
Здрасьте спецы, есть программа сервер, просто слушает и выводит на экр...

Как сделать bind с моим IP
Наверное тема стара и найти ответ в google 1-5 сек, но сейчас мне быстрее...

Winsock Bind Error 10014
bool Server::Bind() { server_address.sin_family = AF_INET; ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru