Websocket szerver készítése

Websocket szerver készítése
2011-08-04T19:05:17+02:00
2011-08-05T02:50:56+02:00
2022-11-22T17:20:34+01:00
h_istvan33
Szevasztok!

Szeretném használni a websocketeket: a JS részét értem is, a szervert viszont magam szeretném megírni. Magyar nyelvű útmutatót nem találtam sajnos , ígyhát nem értek 1-2 dolgot.

Ez volt a wikipédián:

Browser request to the server:
GET /demo HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Host: example.com Origin: http://example.com Sec-WebSocket-Key1: 4 @1 46546xW%0l 1 5 Sec-WebSocket-Key2: 12998 5 Y3 1 .P00 ^n:ds[4U

Server response:
HTTP/1.1 101 WebSocket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Sec-WebSocket-Origin: http://example.com Sec-WebSocket-Location: ws://example.com/demo Sec-WebSocket-Protocol: sample 8jKS'y:G*Co,Wxa-

A kérdésem:
mi az a Sec-WebSocket-Key1, és Key2?
+ mik ezek a kriksz-krakszok a végén?

a válaszokat előre is köszönöm
Mutasd a teljes hozzászólást!
Key1: 4 @1 46546xW%0l 1 5
===> 4146546015 / 5 = 829309203 = 0x316E4113

Key2: 12998 5 Y3 1 .P00
===> 1299853100 / 5 = 259970620 = 0x0F7ED63C

Berakjuk hexa szerkesztővel egy fájlba, majd a ^n:ds[4U -t is utána másoljuk (eredmény mellékelve). Ráeresztjük az md5-öt, és meg is van a keresett 8jKS'y:G*Co,Wxa- karakterlánc

PHP alatt érdemes használni a pack függvényt, amit ennek a cikknek a szerzője használ.
Mutasd a teljes hozzászólást!
Csatolt állomány

  • Üdv!

    A Sec-WebSocket-Key1 és Sec-WebSocket-Key2 valamint a postolt adat (^n:ds[4U) alapján a szerveren md5 hash kerül számításra és ez kerül kiküldésre a kliens felé (8jKS'y:G*Co,Wxa-)

    A pontos algoritmust itt találod:

    Itt találod a WebSocket Protocol Handshake címszó alatt

    A protokoll utf-8 kódolásban keretekbe foglalva kommunikál, a keret 0x00-al kezdődik és 0xFF-el végződik.
    Mutasd a teljes hozzászólást!
  • amit a kliens küld Key-eket, és azt a kódot az üzenet végén, azt hogy alakítsam át erre: '8jKS'y:G*Co,Wxa-' ?

    mit kell md5-be konvertálnom?
    Mutasd a teljes hozzászólást!
  • valaki?
    Mutasd a teljes hozzászólást!
  • találtam egy ilyet:

    The handshake is constructed by concatenating the numbers from the first key, and dividing by the number of spaces. This is then repeated for the second key. The two resulting numbers are concatenated with each other, and with the last 8 bytes after the fields. The final result is an MD5 sum of the concatenated string.


    Key1: 4 @1 46546xW%0l 1 5
    Key2: 12998 5 Y3 1 .P00
    krikszkraksz: ^n:ds[4U

    Ha jól értettem, akkor a visszaküldendő kódot (8jKS'y:G*Co,Wxa-) úgy kapom meg, hogy:

    ((key1számok összefűzve) osztva (szóközök száma key1-ben)) + ((key2számok összefűzve) osztva (szóközök száma key2-ben)) + utolso krikszkraksz

    az eredmény ez lett: 8293092023259970620^n:ds[4U
    ezt MD5-be tettem, és ez jött ki: 61a105bd73ab75855c30da49ac6833fe

    nem az aminek kellett volna

    valakinek van ötlete?
    Mutasd a teljes hozzászólást!
  • Itt van a pontos leiras (ami a wikin van az pontatlan <strikeout>sz4r</strikeout>): draft-hixie-thewebsocketprotocol-76 - The WebSocket protocol

    - kiszeded a szamjegyeket a key1-bol (ez int64-be fer bele, lehet, hogy int32-be is, de jobb a bekesseg)
    - osztod (lefelekerekitos div) a key1-ben levo szokozok szamaval, igy mar elfer 32bit-en
    - a keletkezett 32bites (4byteos) szamnak megforditod a bytesorrendjet (x86-on, hogy bigendian legyen)
    - Az igy kapott 4 byteot konkatenalod a gyujtostringhez

    - A fentieket megismetled key2-re is, ekkor mar a gyujtostringed 8 byteos lesz. (2 32bites binaris szam lesz benne)

    - A gyujtostring vegere rakod a 8byte adatot a http csomag vegerol.
    - a keletkezett 16byte-nak veszed az md5sum-jat. Amit binarisan kell ertelmezni, nem hexakent es az a 16byte a kód.

    procedure proc; function doit(const s:ansistring):ansistring; type tchr4=array[0..3]of ansichar; var ch:ansichar; s2:ansistring; spaces:integer; i:integer; begin spaces:=0;for ch in s do case ch of '0'..'9':s2:=s2+ch; ' ':inc(spaces); end; writeln(s2); i:=StrToInt64(s2) div spaces; Writeln(i); i:=ByteOrderSwap(i); result:=TChr4(i); end; var key1,key2,data,s:ansistring; begin key1:='18x 6]8vM;54 *(5: { U1]8 z [ 8'; key2:='1_ tx7X d < nw 334J702) 7]o}` 0'; data:='Tm[K T2u'; s:=doit(key1)+doit(key2)+data; writeln(BinToHex(s));//0947FA630A5510D3546D5B4B20543275 //md5: 66514a2c664e2f344634217e4b7e4d48 //hex2bin -> fQJ,fN/4F4!~K~MH , STIMMEL end;

    Ugyanez a wiki peldara:
    key1:='4 @1 46546xW%0l 1 5'; //4146546015, div utan: 829309203 (!) key2:='12998 5 Y3 1 .P00'; //1299853100, div utan: 259970620 data:='^n:ds[4U'; s:=doit(key1)+doit(key2)+data; //316E4113 0F7ED63C 5E6E3A64735B3455 //^^ ez bytorderswap utan decimalisan -> 829309203 (!) //szinten a byteorderswap miatt hexaban meg: 0x316E4113 writeln(BinToHex(s)); //md5: 386a4b5327793a472a436f2c5778612d //asBin: 8jKS'y:G*Co,Wxa- <- tadaaaaaaaaaaa
    Mutasd a teljes hozzászólást!
  • Key1: 4 @1 46546xW%0l 1 5
    ===> 4146546015 / 5 = 829309203 = 0x316E4113

    Key2: 12998 5 Y3 1 .P00
    ===> 1299853100 / 5 = 259970620 = 0x0F7ED63C

    Berakjuk hexa szerkesztővel egy fájlba, majd a ^n:ds[4U -t is utána másoljuk (eredmény mellékelve). Ráeresztjük az md5-öt, és meg is van a keresett 8jKS'y:G*Co,Wxa- karakterlánc

    PHP alatt érdemes használni a pack függvényt, amit ennek a cikknek a szerzője használ.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd