Отправка больших файлов по протоколу TCP

Моей клиентской программе необходимо отправить большой файл серверной программе. После того, как клиент подключается к серверу и сервер его принимает, клиенты указывают имя файла, который он будет отправлять. Теперь клиенту нужно отправить файл по протоколу TCP.

Я знаю, что если размер файла небольшой (менее 1 КБ?), я могу отправить его напрямую, используя один вызов функции «отправить» в программировании сокетов. Однако работает ли то же самое, если размер моего файла большой, скажем, около 100 МБ? Я хочу знать, выполняет ли «отправка» сам по себе задачу разбить большие данные на пакеты и надежно их отправить, или я должен быть тем, кто занимается этим?

Спасибо.


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. В модуле программирования сокетов есть функция send.   -  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