abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 22:44 | Nová verze

    Programovací jazyk Python byl vydán v nové major verzi 3.15.0. Podrobný přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 2
    včera 22:33 | Zajímavý projekt

    BIGWORDS.PAGE je open-source webová aplikace, která po otevření odkazu v prohlížeči vykreslí přes celou obrazovku jednoduché informační sdělení. Zpráva i její nastavení jsou uložené v části URL za znakem #, například odkaz https://bigwords.page/#abclinuxu zobrazí jako velký bílý nápis 'abclinuxu' na černém pozadí. Obsah odkazu lze upravovat i vestavěným editorem, ten umožňuje nastavovat formátování a vizuální efekty textu, časovače, QR kódy a obrázky. Zdrojový kód je dostupný pod licencí MIT na GitHubu.

    ❗Červivý Hřib krade❗ | Komentářů: 7
    včera 11:55 | Upozornění

    V neděli 11. října proběhne rotace klíče kořenové zóny. Podruhé v historii. Ondřej Filip na blogu CZ.NIC: "Pokud je pro Vás DNS protokol spíše výzva, ale přesto spravujete nějakou síť či DNS resolver, zkuste si jednoduchý test, který připravila firma Cloudflare na této adrese. Obzvláště zbystřit byste měli, pokud uvidíte nějaká červená políčka."

    Ladislav Hagara | Komentářů: 13
    včera 09:55 | IT novinky

    Vláda Spojených států se rozhodla vyřadit americkou softwarovou společnost Microsoft a několik dalších velkých technologických podniků z programu, který umožňuje kvalifikovaným zahraničním pracovníkům získat povolení k trvalému pobytu. Oznámila to včera administrativa amerického prezidenta Donalda Trumpa. Opatření zdůvodnila rozsáhlým zneužíváním programu, který je dlouhodobě terčem kritiky ze strany Trumpových příznivců, neboť prý znevýhodňuje americké pracovníky.

    Ladislav Hagara | Komentářů: 11
    včera 09:44 | IT novinky

    Datové centrum největší ruské technologické společnosti Jandex v Rjazaňské oblasti se stalo cílem dronového útoku a zastavilo provoz. Jandexu se někdy přezdívá „ruský Google“. Provozuje nejoblíbenější internetový vyhledávač v Rusku nebo aplikace pro objednávky jídla a taxi. Využívají jej desítky milionů lidí v rusky mluvících zemích.

    Ladislav Hagara | Komentářů: 11
    včera 09:33 | Nová verze

    Francouzská společnost Mistral AI představila Mistral Large 4 (interně přezdívaný 'le Chonk', volně přeloženo 'pořádný macek'), 'open-weight multimodální hybridní instruct-and-reasoning model s architekturou granulárního MoE, nativně podporující více jak 160 jazyků'. Model má přes jeden bilión parametrů, z nichž při práci využívá 49 miliard, kontextové okno o délce milion tokenů a obrazový enkodér o 1,6 miliardách parametrů.

    … více »
    ❗Červivý Hřib krade❗ | Komentářů: 2
    včera 03:22 | Nová verze

    Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.20. Díky 227 přispěvatelům.

    Ladislav Hagara | Komentářů: 0
    včera 03:11 | Komunita

    Simon Long oznámil Raspberry Pi Desktop pro PC a Mac s Intelem postavený na aktualizovaném Debianu 13 Trixie. S klientem Raspberry Pi Connect pro vzdálenou správu. Ke stažení je vedle Raspberry Pi OS pro Raspberry Pi.

    Ladislav Hagara | Komentářů: 1
    8.10. 21:33 | Zajímavý projekt

    ESP32-C3 adblock přemění lacinou vývojovou desku ESP32‑C3 na samostatný DNS blokovač nejenom reklamních domén, minimalistickou alternativu k populárnímu Pi-hole. ESP32-C3 adblock místo objemných názvů domén ukládá jejich 40-bitové FNV-1a hashe do flash paměti, které pak binárně prohledává, kontrola jedné domény trvá přibližně 10 milisekund. Blocklist pojme až 537 tisíc domén a lze jej spravovat přes webové rozhraní. Projekt zatím

    … více »
    ❗Červivý Hřib krade❗ | Komentářů: 0
    8.10. 21:00 | Zajímavý software

    ArtCraft je sada open source aplikací pro práci s obrázky a videi "inspirovaných" aplikacemi od Adobe. Napsaných v Rustu. Pro MacOS, Windows i Linux. Běží také ve webovém prohlížeči. Aktuálně se jedná o 7 aplikací: PhotoCraft (Photoshop), VectorCraft (Illustrator), FilmCraft (Premiere Pro), LightCraft (Lightroom), PdfCraft (Acrobat), EffectCraft (After Effects) a DesignCraft (InDesign). Zdrojové kódy jsou k dispozici na GitHubu.

    Ladislav Hagara | Komentářů: 10
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (29%)
     (8%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2824 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Dotaz: Sokety - přijímání zpráv s variabilní délkou

    27.4.2010 00:20 Tomáš Skočdopole | skóre: 13
    Sokety - přijímání zpráv s variabilní délkou
    Přečteno: 670×
    Zdravím,

    Řeším komunikaci klient-server a chtěl bych zde poprosit o vysvetleni par nejasnosti.

    1) Jakym zpusobem se dělá přijímací část, která by měla být schopna přijmout zprávy, které budou mít promennou délku. Každá zpráva by koncila nejspis znakem nového řádku nebo \0. Pro příjem bych použil funkci recv() ale neni mi jasne toto: Pokud zadam velikost bufferu napriklad 10 byte. A ted poslu zpravu, ktera ma treba 8 byte. Vrati se tato funkce s osmi byte v bufferu, nebo zustane cekat na zbyle 2? Pripadne bude cekat na zbyle 2 dokud nevyprsi nejaky timeout?

    2) Dal jsem se chtel zeptat na hlidani toho ukoncovaciho znaku zpravy - nacitat po jednom byte se mi zda jako hloupost. Takze bych to videl na okontrolovani celeho bufferu, co prijmula funkce recv, zda neobsahuje ukoncovaci znak.

    3) Kdyz poslu pres sendv jednu zpravu delce o 3 byte a nasledne druhou zpravu o delce 3 byte a na druhe strane bude funkce recv () cekat s bufferem o velikosti 10 - vrati se mi prvne prvni zprava a potom druha, nebo tyto dve zpravy mi recv vrati za sebou v jednom volani?

    4) Vubec netusim, jakou zvolit velikost bufferu? Budou odesilány zprávy o průměrné velikosti 10 byte, max 40 byte.

    5) Je potreba do kazde zpravy nejak vkladat jeji velikost? Nebo to lze udelat i bez ni?

    Predem vsem mnohokrat dekuji za cenne rady a informace! Zdravim Tomas

    Odpovědi

    27.4.2010 08:07 rastos | skóre: 63 | blog: rastos
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    1) Jakym zpusobem se dělá přijímací část, která by měla být schopna přijmout zprávy, které budou mít promennou délku.

    Ja to riešim tak, že každá správa má na začiatku 32-bitový int, ktorý hovorí o dĺžke zvyšku správy. Tebe vlastne stačí 1 bajt lebo máš krátke správy.
    Pokud zadam velikost bufferu napriklad 10 byte. A ted poslu zpravu, ktera ma treba 8 byte. Vrati se tato funkce s osmi byte v bufferu, nebo zustane cekat na zbyle 2?
    man recv(): The receive calls normally return any data available, up to the requested amount, rather than waiting for receipt of the full amount requested.

    Z toho vyplýva, že ak je dostupných 8 bajtov, tak sa sa prečíta 8 bajtov a recv() vráti 8 bajtov. Na zvyšné 2 sa nečaká.
    2) Dal jsem se chtel zeptat na hlidani toho ukoncovaciho znaku zpravy - nacitat po jednom byte se mi zda jako hloupost.
    Dúfam, že dnešné OS sú už natoľko chytré, že si jadro udržuje v pamäti nejaký buffer prijatých bajtov a recv() len vráti to čo v tom buffer-i nájde, takže ani čítanie po jednom znaku by nemuselo byť pomalé. Môžeš to ale riešiť aj tak, že si budeš sčítavať koľko bajtov recv() prečítalo a volať recv() opakovane až kým celkový počet prečítaných znakov nedosiahne počet, ktorý si chcel pôvodne prečítať.
    3) Kdyz poslu pres sendv jednu zpravu delce o 3 byte a nasledne druhou zpravu o delce 3 byte a na druhe strane bude funkce recv () cekat s bufferem o velikosti 10 - vrati se mi prvne prvni zprava a potom druha, nebo tyto dve zpravy mi recv vrati za sebou v jednom volani?
    Vráti sa to v jednom volaní. Pre také množstvá dát ako prenášaš je vhodné použiť socket option TCP_NODELAY - inak vysielač dáta skutočne pošle až po naplnení nejakej veľkosti odosielacieho bufferu alebo vypršaní nejakého timeout-u.
    4) Vubec netusim, jakou zvolit velikost bufferu? Budou odesilány zprávy o průměrné velikosti 10 byte, max 40 byte.
    Zvoľ 40 bajtov a zariaď sa podľa toho čo recv() vráti.
    5) Je potreba do kazde zpravy nejak vkladat jeji velikost? Nebo to lze udelat i bez ni?
    Myslím, že bude jednoduchšie ak tam tá veľkosť (a prípadne nejaký identifikátor typu správy) bude. Ale neexistuje jediná správna cesta.
    27.4.2010 08:21 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Dúfam, že dnešné OS sú už natoľko chytré, že si jadro udržuje v pamäti nejaký buffer prijatých bajtov a recv() len vráti to čo v tom buffer-i nájde, takže ani čítanie po jednom znaku by nemuselo byť pomalé
    I v takovém případě se ale bude muset přepínat mezi kontextem jádra a aplikace pro každý bajt místo pro celý buffer, takže to pomalejší bude. Ono je to v tomto případě asi jedno, ale načítat ta data po jednom bajtu je prostě ošklivé :-)
    27.4.2010 18:27 Tomáš Skočdopole | skóre: 13
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Zdravim,

    tak ted jsem zjistil, ze TCP_NODELAY nemam definovane. Pouzivam jadro 2.6.32.

    V knize Unix Network Programming od Stevens, Fenner, Rudoff tuto volbu ale popisuji.

    Tomas
    27.4.2010 08:18 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Ad 1) Vrátí 8 bajtů (nebo klidně méně) v bufferu.

    Ad 2) Od toho je tam ten buffer, načtete větší množství dat a pak budete hledat v bufferu.

    Ad 3) Může se to vrátit jako libovolný počet zpráv – celé jako jedna „zpráva“, rozdělené do dvou zpráva jako 3+3 bajty ale klidně taky jako 2+4, 6 volání po jednom bajtu…

    Ad 4) Pokud je to takhle malý objem dat, zvolil bych buffer o maximální možné délce zprávy.

    Ad 5) Předpokládám, že se celou dobu bavíme o TCP/IP komunikaci. Ta není založena na zprávách, ale na proudu bajtů – sendv() i recv() pak vždy představují jen jakési okno do tohoto proudu, nejsou to jednotlivé zprávy. Tzn. rozdělení na zprávy si musíte udělat sám, třeba tak, že si délku zprávy napíšete na její začátek. V případě UDP komunikace (založené na zprávách) byste měl použít recvfrom(), pak budete dostávat celé zprávy po jedné.
    27.4.2010 10:37 chrono
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    A len doplním, že ak pôjde o UDP správy, tak tie môžu prísť v akomkoľvek poradí alebo niektoré nemusia prísť vôbec (ale je to rýchlejšie ako pri TCP, takže vhodný protokol záleží od konkrétneho použitia).
    27.4.2010 10:51 Ivan
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    O rozdeleni na zpravy se postara PUSH Flag v hlavicce TCP packetu. Socket API bohuzel nema moznost PUSH flag vynutit. Pokud ale otevrete socket s option TCP_NODELAY, tak rozumny kernel bude davat (P) flag za kazdou zpravu. Pokud prijimajici kernel uvidi (P) flag v hlavicci tak nesmi data ponechat v prijimajicim bufferu a musi je predat aplikaci.

    Dalsi moznost - ale to uz je hodne velka reznicina - je podivat se na OOB - out of bound data.

    Ivan PS: koukni se na tcpdump jestli uvidis v hlavickach (P). Treba HDR replikace Informixu na AIXu dava PUSH flag za kazdych 4096 bajtu TCP streamu(1 stranka).

    27.4.2010 10:52 Ivan
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Viz: http://www.unixguide.net/network/socketfaq/2.11.shtml
    27.4.2010 10:55 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Ani to ale nezajistí rozdělení na zprávy – pokud třeba pakety dorazí v opačném pořadí nebo se někde cestou spojí, může přijít víc zpráv současně. Tzn. zajistíte tím, že data nebudou v bufferu čekat zbytečně, ale ona tam někdy také mohou čekat nezbytně.
    27.4.2010 11:20 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Ad 1) Vrátí 8 bajtů (nebo klidně méně) v bufferu.

    To "méně" záleží na nastavení SO_RCVLOWAT (minimální počet bajtů které se vrací - default je 1) a na použití blokujících / neblokujících socketů. Pokud je neblokující a nemáte data, může vrátit -1 a EAGAIN.
    Ad 2) Od toho je tam ten buffer, načtete větší množství dat a pak budete hledat v bufferu.

    Tak. Čtení znak po znaku je obvykle známkou chatrného designu aplikace.
    Ad 3) Může se to vrátit jako libovolný počet zpráv – celé jako jedna „zpráva“, rozdělené do dvou zpráva jako 3+3 bajty ale klidně taky jako 2+4, 6 volání po jednom bajtu…

    Tohle opravdu záleží na tom, jestli používáte datagramový socket (SOCK_DGRAM) nebo proudový (SOCK_STREAM). Datagramy se vrací v jednom kuse. Pokud máte moc malý buffer na celý datagram, je zbytek datagramu zahozen. Proudový socket se tváří jako jeden proud (překvapivě) dat, takže bude příchozí pakety slepovat, nebo naopak si můžete vyžádat jen 10 bajtů a pak dalších 10 a nic se nezahodí. Jestli dostanete 3+3 nebo 6 obvykle záleží na tom jak rychle stihnete ty první 3 vybrat.
    Ad 4) Pokud je to takhle malý objem dat, zvolil bych buffer o maximální možné délce zprávy.

    Normálně se buffer zarovnává na násobky 4096 bajtů, i když to může vypadat jako plýtvání.
    Ad 5) Předpokládám, že se celou dobu bavíme o TCP/IP komunikaci. Ta není založena na zprávách, ale na proudu bajtů – sendv() i recv() pak vždy představují jen jakési okno do tohoto proudu, nejsou to jednotlivé zprávy. Tzn. rozdělení na zprávy si musíte udělat sám, třeba tak, že si délku zprávy napíšete na její začátek. V případě UDP komunikace (založené na zprávách) byste měl použít recvfrom(), pak budete dostávat celé zprávy po jedné.
    Souhlas, až na to, že to chování záleží na typu soketu a ne na protokolu. (Viz také můj popis výše.)

    Pokud používáte proudový socket, záleží na Vás, jak si vyřešíte rozdělení zpráv. Můžete na začátek zprávy dát délku nebo naopak můžete zprávu ukončit nějakou sekvencí jednoho a více bajtů. Oboje má svoje plus a mínus.

    In Ada the typical infinite loop would normally be terminated by detonation.
    27.4.2010 12:21 Radovan Garabík
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Ak o protokole nie je rozhodnuté "zhora", pozri si netstrings, môže to byť celkom dobrá inšpirácia.

    27.4.2010 13:22 Tomáš Skočdopole | skóre: 13
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Zdravim!

    Predne dekuji vsem za reakce!

    Abych doupresnil - jedna se o TCP komunikaci.

    Takze recv () vrati ihned vsechny dostupne data co jsou, pripadne kdyz jich je vic, nez nastaveny buffer, tak dalsi dostupna data vrati v dalsim volani - zadna data se nezahodi. Pokud budu pouzivat recv () v blokujicim rezimu, tak bude cekat dokud neprijdou nejaka data. Pokud by prisel jeden bajt, tak ho vrati okamzite? Nebo se bude cekat na nejake vetsi mnozstvi, pripadne timeout? To se pripadne nastavuje jak?

    Takze pokud to dobre chapu, na vysilaci strane musim nastavit TCP_NODELAY abych zajistil, ze data, ktera do sendv zadam se odeslou okamzite. A na prijimaci strane volat recv tolikrat, dokud nenarazim na ukoncovaci znak zpravy. Buffer tedy zarovnam na 4096 bajtů. Kazdy vraceny buffer projdu a zjistim, zda obsahuje ukoncovaci znak. A proste budu muset pocitat s tim, ze by prisel i zacatek nasledujici zpravy.

    Dekuji! Tomas
    27.4.2010 14:56 Ivan
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Jeste muzes stringy prefixovat delkou a volat recv s MSG_PEEK. Tim ziskas delku zpravy a pak muzes nasledne cist celou zpravu.
    27.4.2010 18:26 psonek | skóre: 20 | blog: psonek
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Na to, ze ti recv vrati vsechno bych se nikdy nespolehal. To samo treba u cteni ze souboru pres read - viz manual. Pokud to chces mit bez problemu, tak musis vedet kolik bajtu chces jeste cist - cili bud zpravy pevne delky nebo jeste lepe jak tu uz psali - na zacatku zpravy aby byla delka.

    Pokud se budes spolehat, ze ti recv vrati vsechno, tak se jednou zmeni podminky (rychlost site, jiny OS apod) a prestane to fungovat. Klidne to cteni taky muze byt kdykoliv preruseno signalem.
    27.4.2010 19:44 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Abych doupresnil - jedna se o TCP komunikaci.

    V tom případě nevidím důvod se zahazovat s recv a send, použijte normální read a write.
    Pokud by prisel jeden bajt, tak ho vrati okamzite?
    Ano.
    Nebo se bude cekat na nejake vetsi mnozstvi, pripadne timeout? To se pripadne nastavuje jak?
    Viz setsockopt SO_RCVLOWAT (tohle podle manuálu ale nefunguje na linuxu), případně u recv lze také použít flag MSG_WAITALL.

    Timeout přes setsockopt SO_RCVTIMEO.

    Pro komplikovanější operace lze použít select().
    sendv
    Pokud vím tak sendv neexistuje, maximálně tak writev.
    A na prijimaci strane volat recv tolikrat, dokud nenarazim na ukoncovaci znak zpravy. Buffer tedy zarovnam na 4096 bajtů. Kazdy vraceny buffer projdu a zjistim, zda obsahuje ukoncovaci znak. A proste budu muset pocitat s tim, ze by prisel i zacatek nasledujici zpravy.

    V jazyce C je nejlépe na to udělat cyklický fifo buffer. Např. http://www.vias.org/cppcourse/chap20_05.html nebo http://www.answers.com/topic/circular-buffer-1.

    Jinak doporučuju míň teoretizovat a spíše program otestovat na různé kombinace možností.
    In Ada the typical infinite loop would normally be terminated by detonation.
    27.4.2010 21:33 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    Kazdy vraceny buffer projdu a zjistim, zda obsahuje ukoncovaci znak.
    Jenom pro jistotu: vždy dostanete hodnotu, která určuje, kolik bajtů bylo do bufferu skutečně zapsáno. Buffer tedy nemůžete procházet celý, ale jenom tolik bajtů z něj, kolik tam bylo zapsáno.
    Josef Kufner avatar 3.5.2010 02:56 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Sokety - přijímání zpráv s variabilní délkou
    5) Je potreba do kazde zpravy nejak vkladat jeji velikost? Nebo to lze udelat i bez ni?
    Pokud použiješ textový protokol a každou zprávu na samostatný řádek, tak se bez délky obejdeš. Nebo docela dobrá je taky lispová syntaxe – vemeš závorku a čteš dokud nenajdeš druhou do páru (přitom plníš seznam).

    Rozhodně doporučuju udělat hezký i za cenu, že se bude přenášet o pár bajtů víc. Hezky udělaný jsou POP3 a XMPP, protože POP3 je jednoduchý řádkový a XMPP má univerzální a rozšiřitelný formát (ale pro jednoduché věci radši ten lisp než XML).

    Hlavně ale počítej s tím, že TCP negarantuje doručení zpráv! Takže si musíš ověřovat, která zpráva byla doručena jako poslední pro případ nekorektně uzavřeného spojení. TCP garantuje pouze pořadí dat, ale doručení jen při správně uzavřeném spojení. Kvůli tomuhle se na Jabberu ztrácejí zprávy, když ti vypadne kabel a server si toho nevšimne...
    Hello world ! Segmentation fault (core dumped)

    Založit nové vlákno • Nahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.