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

сервер работает неправильно

26.05.2013, 19:12. Показов 831. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я новичок в С++, написал простой эхо сервер на основе winsock2, и он пашет неправильно. При подключении клиента пишет, что принято 0 байт. И поэтому не отсылает данных назад. Помогите исправить эту фигню.
Компилятор mingw, среда codeblocks, если это играет роль.
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include "server.h"
#include <winsock2.h>
#include <ws2tcpip.h>
 
namespace server{
    Server::~Server(){};
 
    Server::Server(char * port){
        this->port = port; // конструктор сервера
        // инициализация winsock
        WSADATA wsaData;
        int er = WSAStartup(MAKEWORD(2,2), &wsaData);
        if (er != 0){
            throw SExc(WSE,WSAGetLastError()); // если не удалось подключение
        }
        myListenSocket = INVALID_SOCKET; // обнуляем сокет
 
        struct addrinfo *result = NULL;
        struct addrinfo hints; // это данные для открытия соединения
 
        ZeroMemory(&hints, sizeof(hints)); // формируем данные для сокета
        hints.ai_family = AF_INET;
        hints.ai_protocol = IPPROTO_TCP;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_flags = AI_PASSIVE;
 
        er = getaddrinfo(NULL, this->port, &hints, &result); // в result пишутся данные для сокета прослушки
        if (er != 0){
            throw SExc(WSE, WSAGetLastError());
        }
        myListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); // инициализируем непосредственно сокет
        if (myListenSocket == INVALID_SOCKET){ // проверяем есть ли сокет
            throw SExc(WSE, WSAGetLastError());
        }
 
        if (bind(myListenSocket, result->ai_addr, (int)result->ai_addrlen) == INVALID_SOCKET){ // биндим сокет
            throw SExc(WSE, WSAGetLastError()); // и обрабатываем ошибку
        }
 
        if (listen(myListenSocket, SOMAXCONN) == SOCKET_ERROR){ // слушаем сокет
            throw SExc(WSE, WSAGetLastError()); // и обрабатываем соединение
        }
        cout << "Server succesfully initialised" << endl;
    }
 
    void Server::Run(){
        if (myListenSocket == INVALID_SOCKET){
            throw SExc(DESC[NO_SOCKET_AVAILABLE], CODE[NO_SOCKET_AVAILABLE]); // если отсутствует сокет
        }
 
        int er;
        int res_bytes = 0;
        char buffer[buf_len];
 
        while(true){
            cout << "Listening socket" << endl;
            client = accept(myListenSocket, NULL, NULL);
            if (client == INVALID_SOCKET){
                throw SExc(WSE, WSAGetLastError());
            }
            cout << "Client connected" << endl;
 
            res_bytes = recv(client, buffer, buf_len, 0);
            cout << "Server got " << res_bytes << endl;
            if (res_bytes > 0){
                er = send(client, buffer, res_bytes, 0);
                cout << "Server responded " << buffer << endl;
                if (er < 0){
                    throw SExc(WSE, WSAGetLastError());
                }
            }else if (res_bytes <0){
                Stop();
                throw SExc(WSE, WSAGetLastError());
            }
        }
    }
 
    void Server::Stop(){
        if (myListenSocket == INVALID_SOCKET || client == INVALID_SOCKET){
            throw SExc(DESC[NO_SOCKET_AVAILABLE], CODE[NO_SOCKET_AVAILABLE]); // если отсутствует сокет
        }
        closesocket(client);
        closesocket(myListenSocket);
        WSACleanup();
    }
 
    void Server::SetBufferLength(int length){
        this->buf_len = length;
    }
 
    void Server::SetPort(char * port){
        if (this->port) this->port = port;
        else throw SExc(DESC[PORT_ALREADY_SET], CODE[PORT_ALREADY_SET]); // это если порт существует
    }
 
    SExc::SExc(string desc, int code){
        this->desc = desc;
        this->code = code;
    }
 
    void SExc::ShowDesc(){ // простой вывод описания
        cout << "Description: " << this->desc << ". Code: " << this->code << endl;
    }
 
    int SExc::GetCode(){ // возвращает код ошибки
        return this->code;
    }
 
    string SExc::GetDesc(){ // возвращает описание ошибки
        return this->desc;
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "server.h"
 
using namespace std;
using namespace server;
 
int main(){
    Server hasd("2013");
    try{
        hasd.Run();
    }catch(SExc &me){
        me.ShowDesc();
    }
}
примерно так. не ругайте код, я пока новичок.

p.s. код большей частью заимствован с msdn
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.05.2013, 19:12
Ответы с готовыми решениями:

DetectMultiScale неправильно работает в консоли
Написал программу для определения лиц, глаз и рта, когда запускаю приложение в Visual Studio все работает правильно. Когда запускаю...

Неправильно работает серверный TCP-сокет
Имеются клиентский и серверный сокеты, оба находятся в потоках в одном и том же приложении (я просто тестировал их работу). Пользователь...

Не работает простейший почтовый сервер
у меня есть сервер // server.cpp: определяет точку входа для консольного приложения. #ifdef _DEBUG #define new DEBUG_NEW #endif ...

5
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
26.05.2013, 23:26
0 - это по идее означает что клиент отключился. в 63 строке пишет?
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 10
27.05.2013, 06:29  [ТС]
да, именно так.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
27.05.2013, 14:45
Цитата Сообщение от dodler Посмотреть сообщение
да, именно так.
ну так может он и отключился? может вы задали немыслимый запрос и сервер в целях своей безопасности вас закрыл
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
28.05.2013, 09:30
buf_len точно не 0?
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 10
28.05.2013, 12:19  [ТС]
Да, забыл присвоить значение в конструкторе. Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2013, 12:19
Помогаю со студенческими работами здесь

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

Не работает код (формировать запрос и отправлять его на сервер)
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #pragma comment(lib,&quot;ws2_32.lib&quot;) #include&lt;winsock2.h&gt; #include&lt;ws2tcpip.h&gt; void...

TCP клиент-сервер на домашних компах работает а на других нет
Добрый день! Я в сетях совсем нуб. Читаю про TCP-соединение в книге Карпова-Конькова, и пытаюсь запустить пример оттуда. TCP-сервер: ...

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно]
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения: http://*******/KwhuS #include...

Неправильно работает цикл for, и функции работают неправильно
1) Неправильно работает цикл for(k=0...). Входит только 1 раз, дальше вылетает. Делал пошаговую отладку на проверку значения k. Выдаёт...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru