Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2013, 01:04   #1
ulcigor
 
Регистрация: 18.06.2012
Сообщений: 7
По умолчанию вопрос по socket

Добрый день уважаемые форумчане. Возник вопрос по программированию сокетов.
Вопрос собственно в следующем, имеется нативная последовательноть, socket/bind/listen/accept которая должна читать файл/файлы видео, в формате webm и отправлять клиенту. Проблема встала в том, что файл читается черезмерно быстро, и вся эта куча отправляется клиенту, а хотелось бы отправлять не весь сразу, а по мере необходимости подгружать следующую часть.
Следующее, в чём встала проблема, когда пытаюсь подменить дескриптор файла, для посылки клиенту, клиент (браузер) просто перестаёт воспринимать видео и останавливает воспроизведение.
ulcigor вне форума Ответить с цитированием
Старый 23.10.2013, 08:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
файл читается черезмерно быстро, и вся эта куча отправляется клиенту
И что файл такой огромный что его сплитовать нужно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2013, 10:50   #3
ulcigor
 
Регистрация: 18.06.2012
Сообщений: 7
По умолчанию

Ну не факт, что он будет маленьким. Иногда придётся передавать фильм по сети, а это как минимум 700MB
ulcigor вне форума Ответить с цитированием
Старый 23.10.2013, 11:14   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Собственно не вижу проблемы. В функции чтения ограничь буффер принимаемых данных и укажи кол-во байт, которые считываются.
Я по крайней мере так делаю в цикле пока все на считается.
Покажи код считывания.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2013, 11:46   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Надо читать кусок файла, потом посылать клиенту, потом ждать через таймер прежде чем послать следующий кусок.
waleri вне форума Ответить с цитированием
Старый 23.10.2013, 20:51   #6
ulcigor
 
Регистрация: 18.06.2012
Сообщений: 7
По умолчанию

Вот собственно код.


Код:
....
fd = open(files[0], O_RDONLY);
while(true) {
		client = accept(sd, NULL, NULL);
		
		buffer_len = recv(client, buffer, len, 0);
		write(client, headers, strlen(headers));
		
		while(buffer_len) {
			buffer_len = read(fd, buffer, 1025);
			write(client, buffer, buffer_len);
			sleep(1);
		}
		
		close(fd);
		fd = open(files[1], O_RDONLY);
		
		close(client);
	}
....
ulcigor вне форума Ответить с цитированием
Старый 23.10.2013, 22:37   #7
ulcigor
 
Регистрация: 18.06.2012
Сообщений: 7
По умолчанию

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

Вот привожу на всякий случай весь код программы:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include<arpa/inet.h> 
#include <string.h>

#define true 1
#define false 0

char *files[] = {
	"/home/user/Desktop/small.flv",
	"/home/user/Desktop/small2.flv"
};

char headers[] = "HTTP/1.0 200 OK\r\n\
				  Date: Tue, 01 Mar 2011 06:14:58 GMT\r\n\
				  Connection: close\r\n\
				  Cache-control: private\r\n\
				  Content-type:video/flv\r\n\
				  Server: lighttpd/1.4.26\r\n\r\n";


void Sleep(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

int main(int argc, char *argv[]) {   
	int sd, client, fd, buffer_len, len = 1025;
	char buffer[len];
	struct sockaddr_in addr;
	
	if((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		printf("Error socket.");
		close(sd);
		exit(-1);
	}
	
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8080);
	addr.sin_addr.s_addr = INADDR_ANY;
	
	if(bind(sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
		printf("Bind error. Socket close.");
		close(sd);
		exit(-1);
	}
	
	
	if(listen(sd, 10) < 0) {
		printf("Listen error. Socket close.");
		close(sd);
		exit(-1);
	}
	
	fd = open(files[0], O_RDONLY);
	
	while(true) {
		client = accept(sd, NULL, NULL);
		
		buffer_len = recv(client, buffer, len, 0);
		write(client, headers, strlen(headers));
		
		while(buffer_len) {
			buffer_len = read(fd, buffer, 1025);
			
			if(buffer_len < 1025) {
				close(fd);
				fd = open(files[1], O_RDONLY);
			}
			
			write(client, buffer, buffer_len);
			
			Sleep(25000);
		}
		
		close(fd);
		close(client);
	}
	
	close(sd);
	
	return 0;   
}
Подскажите пожалуйста, где ошибка?

Последний раз редактировалось ulcigor; 23.10.2013 в 22:42.
ulcigor вне форума Ответить с цитированием
Старый 24.10.2013, 09:18   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Для того, чтоб понять где ошибка надо знать, какова конечная цель.
Дальше по существу - как вы думаете, что будет, когда закончится отправка *второго* файла?

Далее, пока вы не отправите все файлы новые клиенты подключаться не смогут - это так и задумано?
waleri вне форума Ответить с цитированием
Старый 24.10.2013, 19:20   #9
ulcigor
 
Регистрация: 18.06.2012
Сообщений: 7
По умолчанию

Цель медиа сервер, трансляция видео контента
Когда закончится второй файл, по логике, он снова подргужается и снова должен начать играть.
То, что другие клиенты не смогут подключиться, это не важно сейчас, мне главное понять принцип работы медиа сервера.
Сейчас успешно отправляется первый файл, но когда программа переключается на второй, плеер просто останавливается, суть в этом, как заставить второй файл, продолжить начинание первого, т.е. без остановки начнётся проигрывания второго файла.
ulcigor вне форума Ответить с цитированием
Старый 24.10.2013, 21:11   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Скорее всего ошибка при открытии второго файла.
В результате имеем бесконечный цикл.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос про Socket Pozitif Помощь студентам 4 01.12.2011 18:48
try except and socket Pein95 Общие вопросы Delphi 2 13.05.2011 22:54
Socket IGOMERL C++ Builder 1 16.03.2011 11:05
Socket Get Editor Работа с сетью в Delphi 7 22.04.2008 05:48
Вопрос про Socket-Ы NecroSlider Работа с сетью в Delphi 5 02.08.2007 19:14