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 05:11 | Komunita

    Dlouholetý balíčkář KDE Jonathan Riddell končí. Jeho práci na KDE neon financovala firma Blue Systems, která ale končí (Clemens Tönnies, Jr., dědic jatek Tönnies Holding, ji už nebude sponzorovat), někteří vývojáři KDE se přesunuli k nově založené firmě Techpaladin. Pro Riddella se již nenašlo místo. Následovala debata o organizaci těchto firem, které zahraniční vývojáře nezaměstnávají, nýbrž najímají jako kontraktory (s příslušnými důsledky z pohledu pracovního práva).

    |🇵🇸 | Komentářů: 0
    dnes 02:33 | Komunita

    V Amsterdamu probíhá Blender Conference 2025. Videozáznamy přednášek lze zhlédnout na YouTube. V úvodní keynote Ton Roosendaal oznámil, že k 1. lednu 2026 skončí jako chairman a CEO Blender Foundation. Tyto role převezme současný COO Blender Foundation Francesco Siddi.

    Ladislav Hagara | Komentářů: 0
    dnes 02:22 | Zajímavý článek

    The Document Foundation, organizace zastřešující projekt LibreOffice a další aktivity, zveřejnila výroční zprávu za rok 2024.

    ZCR | Komentářů: 0
    včera 17:33 | Nová verze

    Byla vydána nová stabilní verze 7.6 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 140. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Nová verze

    Byla vydána verze 1.90.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    včera 16:11 | Nová verze

    GNUnet (Wikipedie) byl vydán v nové major verzi 0.25.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.

    Ladislav Hagara | Komentářů: 0
    včera 12:11 | Nová verze

    Byla vydána nová major verze 7.0 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Nově je postavena je na Debianu 13 (Trixie) a GNOME 48 (Bengaluru). Další novinky v příslušném seznamu.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | IT novinky

    Společnost Meta na dvoudenní konferenci Meta Connect 2025 představuje své novinky. První den byly představeny nové AI brýle: Ray-Ban Meta (Gen 2), sportovní Oakley Meta Vanguard a především Meta Ray-Ban Display s integrovaným displejem a EMG náramkem pro ovládání.

    Ladislav Hagara | Komentářů: 0
    včera 01:11 | Nová verze

    Po půl roce vývoje od vydání verze 48 bylo vydáno GNOME 49 s kódovým názvem Brescia (Mastodon). S přehrávačem videí Showtime místo Totemu a prohlížečem dokumentů Papers místo Evince. Podrobný přehled novinek i s náhledy v poznámkách k vydání a v novinkách pro vývojáře.

    Ladislav Hagara | Komentářů: 11
    17.9. 16:22 | Nová verze

    Open source softwarový stack ROCm (Wikipedie) pro vývoj AI a HPC na GPU od AMD byl vydán ve verzi 7.0.0. Přidána byla podpora AMD Instinct MI355X a MI350X.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (39%)
     (55%)
     (6%)
     (9%)
     (12%)
     (9%)
     (12%)
     (9%)
     (15%)
    Celkem 33 hlasů
     Komentářů: 5, poslední včera 22:30
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    1.2.2014 22:23 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: C - lze poslat soubor i zpravu na server soucasne?
    Tak jsem trosku pohnul, akorat jsem se ted za sekl na dvou vecech:

    1) Po prijeti zpravy nezapise server korektne vetsi soubor. Male souboru o velikosti nekolika bytu ano. Velke soubory, napriklad zdrojaky zapise nekorektne. Dival jsem se na kod dlouho, hodle dlouho a proste nemuzu prijit na to, v cem to je. Bud je chyba na strane sestaveni zpravy (tedy klient) nebo ve zpusobu cteni z bufferu a zapisu do souboru na strane serveru. Za boha nemuzu prijit na to, v cem to je. Nejsem schopny to naprogramovat.

    Zde klientska fce ktera posila zpravy. Na zacatek da udaj o delce zpravy, pak zpravu a nakonec data (buffer se souborem):

    void send_msg(char *message, char *path) {
    
        char msg[1024];  
        strcpy(msg, message);
        FILE * fr;
        long lSize;
        char * buffer;
        size_t result;
        char *header;
    
        fr = fopen(path, "rb");
        if (fr == NULL) {
            fputs("File error", stderr);
            exit(1);
        }
        fseek(fr, 0, SEEK_END);
        lSize = ftell(fr);
        rewind(fr);
    
        buffer = (char*) malloc(sizeof (char)*lSize);
        if (buffer == NULL) {
            fputs("Memory error", stderr);
            exit(2);
        }
    
        result = fread(buffer, 1, lSize, fr);
        if (result != lSize) {
            fputs("Reading error", stderr);
            exit(3);
        }
    
        fclose(fr);
        size_t len1 = strlen(msg), len2 = strlen(buffer);
    
        /* delka zpravy */
        asprintf(&header, "%d^", (int) len1 + (int) len2);
        printf("header is: %s\n", header);
        size_t len3 = strlen(header);
        
        char *concat = (char*) malloc(len1 + len2 + len3+1);
        
        if (concat == NULL) {
            MY_KILL_ON_ERROR("Concat message\n");
            exit(1);
        }
      
        /* spoj vse dohromady */
        memcpy(concat, header, len3);
        memcpy(concat + len3 , msg, len1);
        memcpy(concat+ len3 +len1, buffer, len2);   
        send(sockfd, concat, strlen(concat), 0);
    
        free(buffer);
        free(message);
        free(header);
        message = NULL;
    }
    
    Tady jsou funkce serveru. thread_reader nacte buffer (zjisti si delku zpravy a souboru, nacte a posle do fce handle_msg ke zpracovani):
    
    void handle_msg(char *buf, int buflen, int hdrlen) {
        
        char *p_str;
        char chunk[50000];
        char home[1024];
        char path[1024];
        int j;
        int flag;
        int hm_len;
        int parlen;
        int is_dir;
        long fsize; /* delka souboru */
        int meslen;
        int f, ofset;
    
        /*zkopiruj buffer do chunk pro ucely parsovani pomoci strtok*/    
        if (buflen < 1024) {
                    memcpy(chunk, buf, buflen);
                    f = 0;
        } else {
            memcpy(chunk, buf, 1024);
            buflen -= 1024;
            ofset = 1024;
        }
    
        while (f) {
            if (buflen < 1024) {
                    memcpy(chunk + strlen(chunk), buf + ofset, buflen);
                    fsize = 0;
            } else {        
                memcpy(chunk + 1024, buf + ofset, 1024);
                buflen -= 1024;
                ofset += 1024;
            }
        }
        /* parsuj zpravu */
        j = 0;
        p_str = strtok(chunk+hdrlen, ":");
    
        while (p_str != NULL) {
    
            if (j == 0)
                flag = atoi(p_str);
            else if (j == 1)
                is_dir = atoi(p_str);
            else if (j == 2)
                hm_len = atoi(p_str);
            else if (j == 3)
                parlen = atoi(p_str);
            else if (j == 4)
                fsize = atol(p_str);
            else if (j == 5)
                strcpy(path, p_str);
    
            p_str = strtok(NULL, ":");
            j++;
        }
        /* kontrolni vypisy */
        printf("flag: %d\n", flag);
        printf("isdir: %d\n", is_dir);
        printf("hmlen: %d\n", hm_len);
        printf("parlen: %d\n", parlen);
        printf("fsize: %ld\n", fsize);
        printf("path: %s\n", path);
    
        /* nastav cestu do domovskeho adresare */
        memset(home, '\0', strlen (home));
        strcpy(home,mydir);
        strcat(home, path + hm_len);
        home[strlen(home)] = '\0';
    
        char *parent = NULL;
        parent = get_parentdir(home);
    
        if ((flag == IN_CREATE) || (flag == IN_MOVED_TO) || (flag == IN_CLOSE_WRITE)) {
            mkpath(parent, S_IRWXU | S_IRWXG | S_IRWXO);
            if (is_dir)
                mkpath(home, S_IRWXU | S_IRWXG | S_IRWXO);
            else {
                FILE *fr = fopen(home, "wb");
                if (fr == NULL)
                    printf("File Cannot be opened file on server.\n");
    
                /* vypocti delku bufferu pred daty */
                meslen = (buflen - fsize) + hdrlen;
    
               /* zapisuj do souboru postupne po 1KB*/
                if (fsize < 1024){
                    fwrite(buf + meslen, sizeof (char), fsize, fr); 
                    fsize = 0;             
                } else {               
                     fwrite(buf + meslen, sizeof (char), 1024, fr);
                     fsize -= 1024;
                     meslen += 1024;
                }                     
                while (fsize) {
                    if (fsize < 1024) {
                        for (j = 0; j < fsize; j++) {
                            fwrite(buf + meslen, sizeof (char), fsize, fr); 
                            meslen++;
                        }
                        fsize = 0;
                    } else {                   
                        fwrite(buf + meslen, sizeof (char), 1024, fr);
                        fsize -= 1024;
                        meslen += 1024;
                    }
                }           
                fclose(fr);
            }
        }
        free(parent);
    }
    
    
    Delal jsem vse podle vasich rad. Mam delku souboru, delku zpravy, zkopiruji prislusny pocet bajtu a poslu do fwrite. U malych souboru to funguje, u vetsich, treba kolem 10kB to nefunguje. Nevim proc a uz jsem z toho fakt zoufaly.

    2) toto vse "funguje" v netbens debuggeru. Male soubory zkopiruje, vetsi zkopiruje, ale obsah je rozhazena zmet znaku. Kdyz ale debugger vypnu a spustim to normalne (nebo z prikazove radky) tak se nejenze nezkopiruje soubor, ale kontrolni vypisy promennych (flag, delka message, path) maji vzdy nulovou hodnotu. absolutnen etusim proc, setkal se s tom nekdy nekdo?

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.