Изпращане на големи файлове чрез TCP

Моята клиентска програма трябва да изпрати голям файл на сървърната програма. След като клиентът се свърже със сървъра и сървърът го приеме, клиентите посочват името на файла, който ще изпращат. Сега клиентът трябва да изпрати файла чрез TCP.

Знам, че ако размерът на файла е малък (по-малко от 1k байта?), мога да го изпратя директно, като използвам едно извикване на функцията "изпрати" в програмирането на сокет. Дали обаче същото работи, ако размерът на моя файл е голям, да речем около 100 MB? Искам да знам дали "изпращане" само по себе си се справя със задачата да разделя големите данни на пакети и да ги изпраща надеждно или аз трябва да съм този, който се занимава с това?

Благодаря.


person Pranav Sodhani    schedule 24.03.2017    source източник
comment
Не сте посочили нито език, нито платформа/ОС, нито почти нищо.   -  person President James K. Polk    schedule 25.03.2017
comment
Трябва винаги да гледате върнатата стойност на извикването send(), за да видите колко байта данни то всъщност е прочело от вашия масив и поставено в изходящите данни на сокета буфер. Това е също толкова вярно за малки количества данни, колкото и за големи количества (но фактът, че хората изглежда се измъкват без да го правят, понякога ги кара да вярват в противното). Въз основа на стойността, върната от send(), след това ще трябва да определите какво да направите по-нататък (напр. извикайте send() отново с актуализирани аргументи, за да изпратите повече данни, или грешка, или ако всички байтове са изпратени, върнете успех)   -  person Jeremy Friesner    schedule 25.03.2017
comment
Той използва C. Има функция, наречена изпращане, в модула за програмиране на сокет.   -  person Pranav Sodhani    schedule 26.03.2017


Отговори (1)


Опитвам нещо подобно и клиентският ми код изглежда така

static void send_file(char *ipAddress, char *filename)
{
        struct sockaddr_in serverAddr;
        int skt;
        uint32_t addr_size;
        uint32_t sz;
        int32_t sent_bytes;
        FILE *fp;

        if ( inet_pton(AF_INET, ipAddress, &(serverAddr.sin_addr)) ){
                skt = socket(PF_INET, SOCK_STREAM, 0);
                serverAddr.sin_family = AF_INET;
        }
        else {
                inet_pton(AF_INET6, ipAddress, &(serverAddr.sin_addr));
                skt = socket(PF_INET6, SOCK_STREAM, 0);
                serverAddr.sin_family = AF_INET6;
        }

        serverAddr.sin_port = htons(7891);

        memset(serverAddr.sin_zero, '\0', sizeof(serverAddr.sin_zero));

        addr_size = sizeof(serverAddr);
        connect(skt, (struct sockaddr *) &serverAddr, addr_size);

        /*find file size*/
        fp = fopen(filename, "r");
        fseek(fp,0,SEEK_END);
        sz = ftell(fp);
        rewind(fp);

        sent_bytes = send(skt, fp, sz, 0);
        printf("sent %d bytes\n", sent_bytes);
        fclose(fp);
}
person veerabhadra gadag    schedule 09.06.2017