Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование сокетов, ws scheme 
:(
    Опции темы
Роман
Дата 11.2.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



Вот пример сервера:

Код

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
using namespace std;

int main()
{
    int listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    fcntl(listener, F_SETFL, O_NONBLOCK);
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 2);
    
    set<int> clients;
    clients.clear();

    while(1)
    {
        // Заполняем множество сокетов
        fd_set readset;
        FD_ZERO(&readset);
        FD_SET(listener, &readset);

        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
            FD_SET(*it, &readset);

        // Задаём таймаут
        timeval timeout;
        timeout.tv_sec = 1500;
        timeout.tv_usec = 0;

        // Ждём события в одном из сокетов
        int mx = max(listener, *max_element(clients.begin(), clients.end()));
        if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
        {
            perror("select");
            exit(3);
        }
        
        // Определяем тип события и выполняем соответствующие действия
        if(FD_ISSET(listener, &readset))
        {
            // Поступил новый запрос на соединение, используем accept
            int sock = accept(listener, NULL, NULL);
            if(sock < 0)
            {
                perror("accept");
                exit(3);
            }
            
            fcntl(sock, F_SETFL, O_NONBLOCK);

            clients.insert(sock);
        }

        for(set<int>::iterator it = clients.begin(); it != clients.end(); it++)
        {
            if(FD_ISSET(*it, &readset))
            {
                // Поступили данные от клиента, читаем их
                bytes_read = recv(*it, buf, 1024, 0);

                if(bytes_read <= 0)
                {
                    // Соединение разорвано, удаляем сокет из множества
                    close(*it);
                    clients.erase(*it);
                    continue;
                }

                // Отправляем данные обратно клиенту
                send(*it, buf, bytes_read, 0);
            }
        }
    }
    
    return 0;
}


все бы ничего, только браузеры конектятся к протоколу ws. Тоесть так conn = new WebSocket('ws://localhost:1234');
Как посадить сервер на ws?


--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
boostcoder
Дата 11.2.2012, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Роман @  11.2.2012,  17:27 Найти цитируемый пост)
INADDR_ANY

замени на inet_addr("127.0.0.1")
PM WWW   Вверх
Роман
Дата 11.2.2012, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



Цитата(boostcoder @  11.2.2012,  17:42 Найти цитируемый пост)
замени на inet_addr("127.0.0.1") 

У меня сервер не виртуальной машине, имеет IP и домен.


--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
tzirechnoy
Дата 11.2.2012, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Найти описание протокола ws, выяснить, какой у него транспортный протокол (если не tcp/ip -- то соответственно изменить вызов socket()), затем написать обрабатчик приходящих данных в соответствии со спецыфикацыями протокола ws, и отправлять клиентам данные тожэ только в соответствии со спецыфикацыями этого протокола.
PM MAIL   Вверх
Роман
Дата 11.2.2012, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



Видимо для работы с веб-сокетами нужно на сервер устанавливать какое-то дополнение. Осталось выяснить какое.



--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
boostcoder
Дата 11.2.2012, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(Роман @  11.2.2012,  18:31 Найти цитируемый пост)
сервер не виртуальной машине, имеет IP и домен

наверное, об этом нужно говорить в топике. не?
PM WWW   Вверх
tzirechnoy
Дата 11.2.2012, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата(Роман @ 11.2.2012,  20:35)
Видимо для работы с веб-сокетами нужно на сервер устанавливать какое-то дополнение. Осталось выяснить какое.


Вы, видимо, не поняли что я написал. Это прискорбно, хотя и достаточно ожыдаемо.
PM MAIL   Вверх
Роман
Дата 11.2.2012, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 9.7.2006

Репутация: нет
Всего: 1



tzirechnoy, я понял, но это реализация протокола с ноля. В то время как есть готовые реализации работы с сокетами, типа Socket.IO.
Просто открыть порт для сокета можно, но WebSocket - это нововведения HTML5, это, как я понял, не обычное соединение для связи программ.


--------------------
Жизнь -  это последствия от последствий.
user posted image
PM ICQ   Вверх
svlary
Дата 12.2.2012, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(Роман @  11.2.2012,  17:27 Найти цитируемый пост)
только браузеры конектятся к протоколу ws. Тоесть так conn = new WebSocket('ws://localhost:1234');

Два  вопроса :
  • Почему клиенты конектятся на порт 1234, а Ваш сервер слушает  sin_port = htons(3425); ?
  • Зачем Вы слушающий сокет открываете в неблокирующем режиме ? Таймаут можно задать в самом select...

PM MAIL   Вверх
tzirechnoy
Дата 12.2.2012, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
WebSocket - это нововведения HTML5, это, как я понял, не обычное соединение для связи программ.


Мысль найти библиотеку (расшырения языка C называются библиотеками, если что) -- она, с одной стороны правильная. С другой стороны, при таком уровне владения технологией, как Ваш -- будет полезному написать протокол самому, чтобы в будущем не делать таких ошыбок как в процытированном предложэнии.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.