Diskuze: C# TCP server někdy odešle zprávu se zbytky předchozí zprávy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 14 zpráv z 14.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj. Problem je v tom, ze jedna tvoja odoslana sprava moze byt zabalena do viacerych TCP paketov, preto pri citani dostavas neuplne casti. Na .Net urovni je najefektivnesie (ak nie aj jedine) riesenie posielat si nejaky START pripadne STOP znak (skupinu znakov). Potom jednoducho cyklicky citas a spravy si rozdelujes podla tychto znakov (vies ze si ju precital celu).
Zasekl jsi se na stejném problému, který mě děsně trápil když jsem
já poprvé začal s TCP 
Je to přesně jak píše Jahnny nademnou.
Read ani write ti vůbec negarantuje, že pošleš nebo přečteš přesně ten
počet bytů co chceš. Je třeba to například číst opakovaně dokud
nebudeš spokojený.
Možnost je například jak píše Jahnny, ale je jich víc.
Já například si implementovat to, že se vždy pošlou 4 bajty které
obsahují integer kolik dalších bajtů je zpráva kterou musím
přečíst.
Tady máš přesně topic ve kterém jsem se na to ptal
Můžeš si to pročíst.
Děkuji mockrát za odpověď 
Momentálně mám systém vyřešený tak, že každou zprávu končím znakem "!". Poté tu zprávu rozdělím právě tímto znakem, přidám si je do listu a jednu po druhé je vyhodnocuji. Zprávy, které nemají správný formát ignoruji. A jako pojistku mám v Arduinu kód, který když do nějaké doby neobdrží odpověď tak zprávu pošle znova.
Zatím to vypadá, že vše šlape tak jak má. Uvidíme jak se to bude
chovat když k tomu přidáme pomalejší a méně stabilní připojení 
U TCP by se ti určitě nemělo nikdy stát, že nějaká zpráva nepřijde.
To by znamenalo chybu celého spojení a nutnost jeho znovu vytvoření, nikoliv
jen znovu odeslání zprávy. 
No ta záloha je tam hlavně z toho důvodu, kdyby nějaká zpráva přišla neuplná. (Například jedna čast by došla na konci Bufferu a druhá část na začátku nového bufferu)
Ty by jsi to ale ideálně měl udělat tak, že ten buffer budeš skládat
až dokud nenarazíš na ten tvůj "!" až pak tu zprávu zpracovat
Takto pokud chápu správně, tam
přidáváš haldu zbytečného provozu.
Oddelovat vykricnikem fungovat muze, pokud se posilaji jen jednoduche stringy, ktere vykricnik obsahovat nemuzou, ale idealni a bezne pouzivane reseni je (jak uz tu bylo zmineno) posilat nejaky header, kde je uvedena delka a typ zpravy a pak cekat, az se precte cela zprava.
Nad tím už jsem přemýšlel. Napadlo mě, že bych po naplnění bufferu mohl ten buffer uložit do stringu. String pak rozdělit vykřičníkem, odebrat z něj uplné zprávy, zbytek v něm nechat a následně k tomu zbytku přidat obsah dalšího bufferu. Akorát si momentálně nějsem jistý jak udělat tu část "odebrat ze stringu".
No do budoucna určitě přemýšlím nad tím to udělat tímto způsobem, zvlášť když budu do té aplikace přidávat další funkce, ale momentálně to asi plánuju nechat takto. Přece jenom ty stringy které jsou odesílané jsou docela jednoduché a nemají moc variací.
Něco takového asi můžeš. Zkrátka zacykly ten read na tak dlouho, dokud
nebudeš mít i ten vykřičník 
Nicméně lepší je podle mě jak píše Luboš, udělat si ty hlavičky. Pak přesně víš kolik bajtů máš přečíst a neřešíš to až podle dat obsažených v bajtech.
Zobrazeno 14 zpráv z 14.
