Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WebSocket сервер на perl. Проблема соединения. Заголовки формируются неверно. 
:(
    Опции темы
Fynivx
  Дата 13.8.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток, уважаемые форумчане. Живу я хорошо. Есть свой дом, он теплый... Ой. О чем это я? Ах, да. Решил я, значит, ради развлечения написать небольшой WebSocket сервер, и прикрутить его к своему веб-серверу. И только дошел до формирования заголовков для ответа браузеру - уткнулся в огромную каменную стену. И так, и этак бился я об нее, да никакого толку.

В чем суть:
Браузер работает с 76ой версией протокола. Вот что там нужно сделать вконце:
1. Из строки со значением заголовка запроса Sec-WebSocket-Key1 исключить все символы, не являющиеся цифрами (не попадающие в диапазон '0'..'9');
2. Полученную строку превратить в 64-битное целое число (для примера выше получим 1299853100);
3. Полученное число разделить целочисленным делением на количество пробелов в исходной строке со значением заголовка;
4. Полученное число представить в виде 4-х байтового 32-битного числа в формате big endian: старший байт хранится по нулевому смещению;
5. Проделать то же самое с заголовком Sec-WebSocket-Key2;
6. Интерпретируя числа из пунктов 4) и 5) как 4-х байтовые строки, конкатенировать их (сложить в одну строку) и добавить как строку тело запроса;
7. Вычислить от полученной 16-байтной строки значение MD5 и записать это значение в тело ответа "как есть", без преобразования в какое-либо представление;
(пруф)

Именно после посылания этой эмм... этой штуки браузер меня и посылает.

Предположительно проблемные участки кода
Код

sub key76 {
    my $digit = $_[0];
    $digit =~ s/[^0-9]//g; #вырезаем всё кроме цифирей
    $_ = $_[0];
    s/[^ ]//g;#здесь - кроме пробелов

#    до здесь всё правильно. А тут перегон в обратный порядок байт.

#    $digit /= length;#делим на колво пробелов

#    my $trololo = pack( "V", $digit );#для сравнения
#    $digit = sprintf( '%x', $digit );#в 16иричный вид
#    $digit = "0".$digit while length $digit < 8;#дополняем до 4х байт
#    print "ololo Oo\n" if $trololo eq chr( hex substr( $digit, 6, 2 ) ).#объединяем в обратном порядке.
#                                chr( hex substr( $digit, 4, 2 ) ).#Если пак работает правильно - удивленно ржем.
#                                chr( hex substr( $digit, 2, 2 ) ).#Зы - самый тупорылый способ выбрал, какой только придумал.
#                                chr( hex substr( $digit, 0, 2 ) );# Чтобы уж точно правильно работал. Работает. Но браузер не верит.(
#    return chr( hex substr( $digit, 6, 2 ) ).
#                 chr( hex substr( $digit, 4, 2 ) ).
#                 chr( hex substr( $digit, 2, 2 ) ).
#                 chr( hex substr( $digit, 0, 2 ) );
    return pack( "V", $digit/length );#возвращает правильное значение. Но - хз, почему не работает.
}
Код

$handle->send(
    "HTTP/1.1 101 Web Socket Protocol Handshake\r\n".
    "Upgrade: WebSocket\r\n".
    "Connection: Upgrade\r\n".
    "Sec-WebSocket-Origin: ".$connections{$handle}{"origin"}."\r\n".
    "Sec-WebSocket-Location: ws://".$connections{$handle}{"host"}.
                                $connections{$handle}{"path"}."\r\n".
    "Sec-WebSocket-Protocol: system\r\n\r\n".
    md5(#тут, собственно, конкатенация и вычисление хэша.
        #Может, дело в md5? Может стоит md5_hex врубить?
        # Но, вроде, врубал и не работало =/
        key76( $connections{$handle}{"key1"} ).
        key76( $connections{$handle}{"key2"} ).
        $connections{$handle}{"body"}
    )
);                        

Не знаю - в днк ли у меня ошибка, или просто думать разучился, но проблема есть, в связи с чем, отчаявшись, и обращаюсь к вам.
Скажите, пожалуйста, что я делаю не так? =/
Вот ссылка на  всё написанное на данный момент.
Всем заранее огроооомное спасибо.

Или ошибка просто в доверии википедии? =/
PM MAIL   Вверх
Pfailed
Дата 14.8.2011, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А готовое не хотите использовать? На cpan по запросу "websocket" есть кое-что.


--------------------
PM MAIL   Вверх
Fynivx
Дата 14.8.2011, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хм... Ну, да. Собственно Net::Async::WebSocket и Protocol::WebSocket.
Покопаюсь в коде, может, они чего-то и стоя.
Спасибо.
PM MAIL   Вверх
Fynivx
Дата 14.8.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вы не поверите. Второй ведет себя точно как мой, а первый вообще через -MCPAN с моего зеркала не ставится.
Вывод - пойдем со злости писать под node.js и ругаться с техподдержкой гугля.  smile

Кстати, да. Еще на кодегугле посмотреть нужно, что они там с этим протоколом творят.
PM MAIL   Вверх
Fynivx
Дата 14.8.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И так, проблема решена. Относительно. Всё сделано на node.js с использованием этого скрипта ака библиотеки.

Код пока не читал. Если руки дойдут, попробую разобраться и переписать на перле. Отпишусь.

PM MAIL   Вверх
gcc
Дата 20.8.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



еще websocket есть на фреймфорке Mojolicious

PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




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


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

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