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í
×
    dnes 02:16 | Bezpečnostní upozornění

    Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.

    Max | Komentářů: 0
    včera 23:22 | Zajímavý software

    Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?

    Stanislav Hoferek | Komentářů: 0
    včera 14:33 | Komunita

    Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.

    Ladislav Hagara | Komentářů: 1
    včera 14:11 | IT novinky

    Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | Humor

    Čínská státní televize pozastavila vysílání španělské La Ligy a čínské internetové platformy omezily obsah s Kylianem Mbappém poté, co slavný fotbalista ve francouzském pořadu The Bridge mluvil o svém oblíbeném memu, v němž je jeho tvář vložena do portrétu zobrazujícího diktátora Mao Ce-tunga. 'Můj oblíbený mem je ten, na kterém dali můj obličej na čínského diktátora. To mě opravdu rozesmívá. S přáteli ho používám pořád' řekl,

    … více »
    Pendrekama do nich❗ | Komentářů: 5
    včera 13:22 | IT novinky

    Při příležitosti oslav Dne vzniku samostatného československého státu (28. října) byly uděleny medaile Za zásluhy tvůrci aplikace Záchranka Filipu Maleňákovi, vědci v oblasti umělé inteligence Tomáši Mikolovovi a Olze Štěpánkové, vědkyni zabývající se kybernetikou, robotikou a strojovým učením, průkopnici v oblastech výuky a využití umělé inteligence v medicínském inženýrství.

    Pendrekama do nich❗ | Komentářů: 3
    včera 01:33 | IT novinky

    Apple představil nový iPad mini, iMac s čipem M6, 14palcový MacBook Pro s čipem M6 a MacBook Pro s PROLED XDR displejem – první Mac s dotykovým ovládáním.

    Ladislav Hagara | Komentářů: 5
    28.10. 23:22 | Zajímavý projekt

    Nedávno představený projekt mapSTL.com řeší budoucnost. 𝕏: "Netušil jsem, kolik patentů na generování map existuje. Existují patenty na generování fantasy map 🫣. Cokoliv je na 3D tiskárnu a tvoří to produkt, bude to mít patenty. Tak bacha na to!" … více »

    Ladislav Hagara | Komentářů: 3
    28.10. 18:55 | Nová verze

    Multiplatformní emulátor terminálu Ghostty byl vydán ve verzi 1.4 (𝕏). Přehled novinek a vylepšení v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    28.10. 18:22 | Bezpečnostní upozornění

    Byla objevena zranitelnost Tailworm v Tailscale a Headscale umožňující lokální eskalaci práv přihlášeného uživatele. Následně byla v Tailscale v opravené verzi 1.104.4+ změněna architektura aplikace. Viz příspěvek na blogu Tailscale.

    vencour | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2941 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    Dotaz: UDP klient, funkce read

    20.4.2011 15:04 Michal
    UDP klient, funkce read
    Přečteno: 543×
    Ahoj, dělám klienta, který má pomocí UDP stáhnout ze serveru soubor. Server posílá data po 265B paketech (9B hlavička, 256B data). Všude se píše, že s UDP se používá dvojice recvfrom a sendto. Ale mě se nelíbilo, že se jim musí předávat další struktura s informacemi o druhé straně.

    Někde jsem si přečetl, že se dají normálně použít i funkce read a write stejně jako při komunikaci skrz TCP. Rozhodl jsem se, že to tedy udělám tak.

    Připojení:
    
        unsigned int       inaddr;
        struct hostent     *ph;
        struct sockaddr_in my_addr;
    
        if ((inaddr = inet_addr(addr))!=INADDR_NONE)
            ph=gethostbyaddr((char *)&inaddr, sizeof(unsigned int), AF_INET);
        else  ph=gethostbyname(addr);
    
        if (ph) {
            cout << "Connecting to " << ph->h_name << endl;
        }
        else {
            cerr << "Unable to connect " << ph->h_name << ", not in name list." << endl;
            return false;
        }
    
        if ((m_iSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))<0) {
            cerr << "Can not open socket." << endl;
            return false;
        }
    
        bzero((char *) &my_addr, sizeof(my_addr));
        my_addr.sin_family = AF_INET;
        my_addr.sin_addr.s_addr = INADDR_ANY;
        my_addr.sin_port = htons(4000);
    
        if (connect(m_iSocket,  (struct sockaddr *) &my_addr, sizeof(my_addr)) < 0) {
            cerr << "Can\'t connect." << endl;
            close(m_iSocket);
            return false;
        }
    
    
    Potom server nějak (nevím jak, mám jen binárku) odesílá data a já je v klientovi přijímám takto:
    
    
    ...
    struct Message {
        long    id;
        unsigned short   seq;
        unsigned short   ack;
        char    flag;
        char    data[256];
    };
    ...
        Message buf;
        for (int i = 0; i < 256; i++) {
            buf.data[i] = m_mRecMsg.data[i] = 0;
        }
    
        int ret = read(m_iSocket, (void *)&buf, sizeof(buf));
        cout << "Pocet prijatych bajtu: " << dec << ret << " z " << sizeof(buf) << endl;
        if (ret < 0) {
            cerr << "Error reading from socket." << errno << endl;
            return false;
        }
        m_iLastRecvDataLength = ret - sizeof(long) - 2*sizeof(short) - 1;
    
        if (m_iLastRecvDataLength > 0) {
            strncpy(m_mRecMsg.data, buf.data, m_iLastRecvDataLength);
        }
        m_mRecMsg.ack = ntohs(buf.ack);
        m_mRecMsg.flag = buf.flag;
        m_mRecMsg.id = ntohl(buf.id);
        m_mRecMsg.seq = ntohs(buf.seq);
    
        printMsg(m_mRecMsg);
    
        return true;
    
    
    Je to výňatek z programu, ale pro ilustraci by to mělo snad stačit. Problém je v tom, že server odešle 256B dat + 9B hlavičku, klient by je měl tedy přijmout. návratová hodnota z read dokonce potvrzuje, že přijala 265B dat. Ale přesto jsou data neúplná. V poli data je někdy jen určitý počet (asi tak 100-150) platných bajtů a zbytek jsou nuly. Vypadá to například takhle:
    
    server:
    F1EA0006  SEND  127.0.0.1:41229  seq=18176 ack=0 flags=00 data(256): 5b 7b 15 f6 8d 00 41 80 ... 6f 73 a6 73 60 60 77 7a
    klient: 
    Pocet prijatych bajtu: 265 z 268
    Prijata: f1ea0006	0	18176	0	data(256):5b 7b 15 f6 8d ... 0 0 0 0 0 0 0 0 0 0 
    
    

    Může za to read? Nebo mám něco principiálně špatně? Vím, že u TCP se muselo číst po bajtech, ale UDP se snad nesmí ne?

    Budu moc vděčný za každou radu, už se s tím morduju 2 dny.

    Odpovědi

    20.4.2011 16:49 Michal
    Rozbalit Rozbalit vše Re: UDP klient, funkce read
    Jenom doplním, že píšu v C++ pod Linuxem.
    20.4.2011 17:54 Sten
    Rozbalit Rozbalit vše Re: UDP klient, funkce read
    sendto a recvfrom se používají, jenom pokud nepoužijete connect, jinak můžete klidně používat send a recv, resp. jejich ekvivalenty write a read.

    Chyba bude v použití strncpy, to totiž skončí na prvním null bajtu. Použijte memcpy. Případně raději použijte nějaký postup z C++.
    20.4.2011 19:35 Michal
    Rozbalit Rozbalit vše Re: UDP klient, funkce read
    Máte pravdu, nenapadlo mě, že se mezi daty může objevit i \0 i když teď je mi to už jasný :-). Mockrát děkuji.

    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.