WebSocked Server
, Приём данных
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.172] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
WebSocked Server
, Приём данных
|
|
|
|
|
Доброго времени суток.
Столкнулся с некой трудностью.... Подскажите знающие люди. Делаю так : Парсим вот эту строчку ![]() ![]() 81FE0140C01AA420977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E977FC673AF79CF45B43AD64FA371D70EEE348A0E67 Вот таким методом ![]() ![]() procedure TForm1.Button3Click(Sender: TObject); var buff:string; RWebSocked: Packed record PayloadData : TMemoryStream; MaskKey: Array [0..3] of byte; OpCode:byte; PayloadLen:Integer; Fin,Mask:Boolean; end; x:TByteArray; xLen,i,j,k,t:Integer; begin i:=1; buff:=Edit8.Text; xLen:=0; FillChar(RWebSocked,SizeOf(RWebSocked),$0); while not (i >= length(Edit8.Text)) do begin x[xLen]:=StrToInt('0x'+buff[i]+buff[i+1]); Inc(i,2);Inc(xLen); end; Memo3.Lines.Add('Packed len : '+IntToStr(xLen)); try RWebSocked.PayloadData:=TMemoryStream.Create; RWebSocked.PayloadData.Clear; except on E:Exception do begin Memo3.Lines.Add('ERROR:'+E.ClassName+' --> '+E.Message) end; end; i:=0; repeat with RWebSocked do begin Fin:=boolean(x[i] and $80); OpCode:=x[i] and $0F; Inc(i); Mask:=Boolean(x[i] and $80); PayloadLen:=x[i] and $7F; Inc(i); if PayloadLen = 126 then inc(i) {32-bit} else if PayloadLen = 127 then inc(i,2); {64-bit} MaskKey[0]:=x[i]; inc(i); MaskKey[1]:=x[i]; inc(i); MaskKey[2]:=x[i]; inc(i); MaskKey[3]:=x[i]; inc(i); j:=PayloadLen+i-1; k:=0; for i:=i to j do begin t:=x[i] xor MaskKey[k mod 4]; PayloadData.Write(t,1); Inc(k); end; end; until i>=xLen; RWebSocked.PayloadData.Position:=0; ShowMessage('Complite Packed len : '+IntToStr(xLen)); Memo3.Lines.LoadFromStream(RWebSocked.PayloadData); end; На выходе получаетм вот это : ![]() ![]() `Web3ock t r cksN...NWeb3ock t r cksN...NWeb3ock t r cksN...NWeb3ock t r cksN...NWeb3ock t r cksN...NWeb3ock t r cksN...NWeb3o K KZ \K#E 6 C Когда должно быть вот это : ![]() ![]() WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks.....WebSocket rocks..... Где и как я мог промахнутся или я не правильно понял описание протокола? |
|
Сообщ.
#2
,
|
|
|
|
Цитата konvikkor @ или я не правильно понял описание протокола? Если ты еще сообщишь, какого протокола, будет вообще замечательно |
|
Сообщ.
#3
,
|
|
|
|
|
Сообщ.
#4
,
|
|
|
|
И так, не внимательно прочёл документацию. Увы пришлось день потратить чтобы всё перечитать и пересмотреть. Ошибка заключалась в длине пакета. Из за этого происходило смещение маски.
Кому интересно то вот парсер пакетов WebSocked ![]() ![]() procedure TForm1.Button3Click(Sender: TObject); var buff:string; RWebSocked: Packed record PayloadData : TMemoryStream; MaskKey: Array [0..3] of byte; OpCode:byte; PayloadLen:Int64; Fin,Mask:Boolean; end; x:TByteArray; xLen,i,j,k,t:Integer; begin i:=1; buff:=Edit8.Text; xLen:=0; FillChar(RWebSocked,SizeOf(RWebSocked),$0); while not (i >= length(Edit8.Text)) do begin x[xLen]:=StrToInt('0x'+buff[i]+buff[i+1]); Inc(i,2);Inc(xLen); end; Memo3.Lines.Add('Packed len : '+IntToStr(xLen)); try RWebSocked.PayloadData:=TMemoryStream.Create; RWebSocked.PayloadData.Clear; except on E:Exception do begin Memo3.Lines.Add('ERROR:'+E.ClassName+' --> '+E.Message) end; end; i:=0; repeat with RWebSocked do begin Fin:=boolean(x[i] and $80); OpCode:=x[i] and $0F; Inc(i); Mask:=Boolean(x[i] and $80); PayloadLen:=x[i] and $7F; Inc(i); if PayloadLen = 126 then begin PayloadLen:=StrToInt('0x'+IntToHex(x[i],2)+IntToHex(x[i+1],2)); inc(i,2); {32-bit} end; if PayloadLen = 127 then begin PayloadLen:=StrToInt('0x'+IntToHex(x[i],2) +IntToHex(x[i+1],2) +IntToHex(x[i+2],2) +IntToHex(x[i+3],2) +IntToHex(x[i+4],2) +IntToHex(x[i+5],2) +IntToHex(x[i+6],2) +IntToHex(x[i+7],2)); inc(i,8); {64-bit} end; MaskKey[0]:=x[i]; inc(i); MaskKey[1]:=x[i]; inc(i); MaskKey[2]:=x[i]; inc(i); MaskKey[3]:=x[i]; inc(i); j:=PayloadLen+i-1; k:=0; for i:=i to j do begin t:=ord(x[i]) xor MaskKey[k mod 4]; PayloadData.Write(t,1); Inc(k); end; end; until i>=xLen; RWebSocked.PayloadData.Position:=0; ShowMessage('Complite Packed len : '+IntToStr(xLen)); Memo3.Lines.LoadFromStream(RWebSocked.PayloadData); end; |