Лучший способ отправить видео через TCP Socket в C - PullRequest
5 голосов
/ 31 января 2011

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

Пример кода

//bind server socketfd
if (bind(sfdServer, (struct sockaddr*)&adrServer, ServerAddrLen) < 0)
    error("ERROR binding");
listen(sfdServer, 5);
while(1){
    printf("Waiting for connections...\n");
    sfdClient = accept(sfdServer, (struct sockaddr*)&adrClient, &ClientAddrLen);
    if(sfdClient < 0)
        error("ERROR accepting");

    printf("Connection Established.\n");
    //set buffer to zero        
    bzero(buff, 2048);
    printf("Reading from client.\n");
    numChar = read(sfdClient, buff, 2048);

    //What should go here?

    close(sfdClient);
    close(sfdServer);

}

Могу ли я просто сохранить буфер как файл movie.mp4 или что-то в этом роде? Я понимаю, что мне может понадобиться изменить размер буфера или отправить его порциями. Но я не могу найти хорошую информацию о том, как это сделать. Буду признателен за любую помощь или точку в правильном направлении!

Ответы [ 2 ]

3 голосов
/ 31 января 2011

Вы бы записали куски буфера в файл.

Сначала откройте выходной файл для записи:

   #include <sys/types.h>
   #include <sys/stat.h>
   #include <fcntl.h>


   int outfd;
   outfd = open("movie.mp4", O_WRONLY|);

Затем, после read(), напишите свои байты:

   numWrite = write(outfd, buff, numChar);

Обратите внимание, что вам нужно иметь дело с несколькими случаями разбивки / буферизации, такими как:

  • Либо read(), либо write(), возвращающий ноль или -1 (ошибка)
  • Чтение до тех пор, пока не будет доступно больше байтов. Прямо сейчас ваш код читает только 2048 байт, а затем закрывает сокет.
  • write() записывает меньше байтов, чем запрошено (это может происходить в сетевых файловых системах)
2 голосов
/ 31 января 2011

Во-первых, вы должны рассмотреть возможность использования sendfile() или аналога для вашей системы.То есть вместо того, чтобы читать кусок файла в вашу память только для того, чтобы записать его обратно куда-то, вы должны отобразить в памяти свой файловый дескриптор и отправить все за один раз.разделить поток на пакеты для вас.В идеале, удаленный узел должен точно знать, сколько ожидать авансом, чтобы он мог обрабатывать преждевременное завершение (поэтому заголовки HTTP содержат длину содержимого).

Поэтому перед отправкой данных используйте какое-либо рукопожатие.Тогда отправитель должен просто позвонить sendfile() в цикле, обращая внимание на количество отправленных данных и возвращенных offet.Получатель должен вызвать recv() в цикле, чтобы удостовериться, что все это прибыло (нет стандартного "recvfile()").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...