Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

Реализация websocket сервера, не вызывается accept

27.07.2014, 21:03. Показов 2149. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу реализацию websocket сервера. Суть проста, клиент посылает запрос, он уходит в отдельный поток для обработки и после обработки соединение не должно закрываться, то есть все клиенты должны быть постоянно подключены. Отрывки кода
C++
1
2
3
4
5
6
7
8
9
    SOCKET client;
    while( true ) {
        client = accept(socket, NULL, NULL);
        if(client == INVALID_SOCKET) {
            continue;
        }
        std::thread th(f, client);
        th.detach();
    }
и функция f
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void f( SOCKET cl )
{
    int len;
    char buf[513];
    Client client( cl );
    string RecvData;
 
    while( len = recv(cl, buf, 512, 0) ) {
        buf[len] = '\0';
        RecvData += buf;
        if( len < 512 ) {
            break;
        }
    };
 
    client.handleshake( RecvData );
}
Проблема вся в том что при первом подключении всё отлично работает, метод handleshake подтверждает соединение, но дальше что бы клиент не слал accept просто не вызывается. Клиентский javascript код полностью корректен и был проверен на таком же сервере написанном на qt, но сейчас решили переписать нативным кодом и вот такая беда. Как заставить сокеты корректно обрабатывать каждое соединение?

Добавлено через 4 часа 14 минут
Неужели с сокетами никто не работал или это я так плохо проблему изложил? Это же даже не относиться к протоколу вебсокетов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2014, 21:03
Ответы с готовыми решениями:

Как генерировать Sec-WebSocket-Accept
Прочел в Wiki что генерация на PHP делается таким методом: echo base64_encode(SHA1($key.&quot;258EAFA5-E914-47DA-95CA-C5AB0DC85B11&quot;));...

Зависание формы, когда вызывается ServerSocket.accept()
Вот у меня есть код: Thread gui = new Thread(new Runnable(){ public void run() { ServerConfigWindow...

Accept, адрес сервера
Доброго всем дня! подскажите, не хватает тяму додуматься - есть сервер, доступен по нескольким адресам. Висит на нем демон, слушает...

6
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2014, 21:53
Цитата Сообщение от OrmaJever Посмотреть сообщение
Неужели с сокетами никто не работал
В С++ есть сокеты?
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
27.07.2014, 22:02  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
В С++ есть сокеты?
да, и их даже можно использовать. Может я просто не допонимаю их работу, может accept должен вызывается только для первого соединения, а если оно не закрыто то может нужно как-то зацикливать recv ? Хотя звучит как бред. Мне бы хоть какую-то зацепку куда копать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2014, 22:26
Цитата Сообщение от OrmaJever Посмотреть сообщение
да, и их даже можно использовать.
Нет, это не С++, а WinAPI.
https://www.cyberforum.ru/win-api/
0
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
27.07.2014, 22:46
https://www.cyberforum.ru/blog... g2591.html
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
27.07.2014, 22:55  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Нет, это не С++, а WinAPI.
Спасибо, я понимаю что сокеты пока ещё апи ОС. Правильно ли я понял что я ошибся разделом? Тему перенести можно?
Цитата Сообщение от oxyfat Посмотреть сообщение
https://www.cyberforum.ru/blogs/473436/blog2591.html
Извините но там слишком много кода что бы в нём разбираться.
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
29.07.2014, 00:17  [ТС]
Всё, проблема решена, я был прав.
accept вызывается только при новом подключении, если же сокет не был закрыт и в него пишут новые данные то accept вызван уже не будет, для этого нужно зацикливать recv.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    int received;
    char buf[513];
    Client client( cl );
    string RecvData;
 
    do {
        received = recv(cl, buf, 512, 0);
        buf[received] = '\0';
        if ( received > 0 ) {
            RecvData += buf;
            if(received < 512) {
                if( !client.handleshake( RecvData ) ) {
                    cout << client.read( RecvData ) << endl;
                }
 
                RecvData.clear();
            }
        }
    } while( received > -1 && cl );
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2014, 00:17
Помогаю со студенческими работами здесь

Использование функции accept() для сервера на основе сокетов
Доброго времени суток, уважаемые форумчане. Сейчас на си++ пишу сервер-клиент на основе сокетов. Появилось несколько вопросов: 1....

Реализация WebSocket
На Java есть вот такая, библиотечка Есть ли, что-то подобное для ?

Websocket реализация соединения на джаве
Всем доброго времени суток. Подскажите пожалуйста простенькую реализацию websocket соединения на джаве. Исходники там, или библиотеку...

Забрать данные с сервера через webSocket
Доброго времени всем. Помогите пожалуйста разобраться с webSocket. Предыстория такая. Я получил задание на сбор данных из различных...

WebSocket без сервера. Только обработка данных
Поиск дает готовые решения где просто биндится адрес и сразу можно получать данные, а мне нужно чтобы соединение устанавливалось отдельно,...


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

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

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru