Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Ondřej Novák 17. 01. 2020, 12:15:30
-
Zdravím. Má tu někdo zkušenost s provozováním signalr klienta na nejnižší úrovni? Bohužel jsem musel implementovat klienta vlastními silami, protože to píšu v C++ pod linuxem a nějak jsem nesehnal vhodnou knihovnu pro můj případ. Potřebuju jen číst data ze streamu po websocketu, přesněji kótace na burze
Mám k dispozici HTTPs klienta a websocket klienta. Nemohu postovat kód, je hodně custom
Scénář
1. pošlu /negotiate
2. dostanu ConnectionToken {TOKEN}
3. otevřu websocket /connect?transport=webSockets&ConnectionToken={TOKEN}&clientProtocol=1.5
4. počkám na obdržení první frame
5. pošlu /start?transport=webSockets&ConnectionToken={TOKEN}&clientProtocol=1.5
Problém? Náhodně (v blocích) cca v 50% se mi nepodaří navázat spojení a napíše to, že mám neplatný ConnectionToken. Tato situace se třeba opakuje pět minut jak to můj software neustále po půl minutě zkouší. Pak to najednou naběhne a vše jede OK. Vzhledem k tomu, že klient pak drží spojení a je happy, nové navazování úž nepokouší, dokud to zase není třeba (spadne spojení nebo musím restartovat).
Hledám chybu ve svém kódu. Jak správně navazovat spojení a kdy přesně vyslat /start? Byl jsem dokonce tak zoufalý, že při selhání /start jej opakuju třeba 3x za sebou po prodlevě. Někdy se chytne až na potřetí což je po cca 10 sekundách. Možná že druhá strana je pomalá s navazováním, že tedy problém není na mé straně. Možná že mám něco hledat v odpovědi websocketu, že nyní je spojení navázáno a mohu ho spustit?
-
A co použít oficiálního c++ klienta
https://github.com/aspnet/SignalR-Client-Cpp
-
Leda že bych se podíval, jak to dělají. Já potřebuju 5% funkcionality nejen samotného protokolu, ale podíl na celé aplikaci je zhruba asi tak malý. A nemám zájem slepovat můj projekt s něčím, co je 2x větší a má 95% kódu který řeší to co již mám vyřešeno jinak
-
Problém vyřešen.
Problém se ukázal v tom, že nezpracovávám cookies. A server si při /negotiate ke klientovi nastavoval cookie "AWSALB", která slouží load balanceru najít správnou instanci při /connect a /start. Takže to náhodně padalo, jak to došlo na různé instance.
Člověk si říká, že tohle by měl přece signalr řešit.