веб-сокеты в Firefox 8 и Chrome 15 - PullRequest
0 голосов
/ 10 декабря 2011

Я пытаюсь создать свой собственный сервер веб-сокетов.Он хорошо работает с Safari и Opera, но не работает с Firefox 8 и Chrome 15.

Для настройки соединения я использую такой код

private static void Response(Socket client, string secKey)
{
   string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
   SHA1 sha = new SHA1CryptoServiceProvider();
   byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(secKey + guid));
   string acceptKey = Convert.ToBase64String(hash);

   client.Send(Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" +   Environment.NewLine));
   client.Send(Encoding.UTF8.GetBytes("Upgrade: WebSocket" + Environment.NewLine));
   client.Send(Encoding.UTF8.GetBytes("Connection: Upgrade" + Environment.NewLine));
   client.Send(Encoding.UTF8.GetBytes("Sec-WebSocket-Accept: " + acceptKey + Environment.NewLine));
}

И для отправки сообщений:

var mess = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); 
item.Send(new byte[] { 129 });
item.Send(new byte[] { (byte)mess.Length });
item.Send(mess);

Кто-нибудь может мне помочь и указать на мои ошибки?

1 Ответ

1 голос
/ 11 декабря 2011

Этот код предназначен только для Firefox 8 и Chrome 15 и выше. Поэтому я предполагаю, что ваш рабочий код в более ранних браузерах отличается от того, что вы опубликовали, так как они имеют другой формат проводов.

Есть несколько проблем с вашим кодом:

  • Вам нужно выбрать и отправить обратно протокол, если браузер отправляет заголовок протокола (что, вероятно, будет).
  • Вам необходимо отправлять возврат каретки + перевод строки после каждого заголовка (CR + LF, '\ r \ n', 0x0D0A).
  • После окончательного заголовка вам нужно отправить дополнительный возврат каретки + перевод строки (т. Е. '\ R \ n \ r \ n'), чтобы указать завершение рукопожатия.

Ваш алгоритм отправки также чрезмерно упрощен (хотя он должен работать для вас, например). Если длина сообщения превышает 126 байтов, вы должны закодировать длину в несколько байтов заголовка кадра.

Также обратите внимание, что для получения фреймов вам потребуется снять маску с полезной нагрузки. Первые четыре байта полезной нагрузки являются значениями маскирования. Вам необходимо XOR эти значения для следующих значений полезной нагрузки. Как указано в спецификации :

j                   = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...