Название: Отправить файл по сети Отправлено: RomiX от Февраль 15, 2012, 19:52 Плз помогите отправить файл через QTcpSocket и принять с помощью QTcpServer. Уже пол дня мучаюсь, вроде все отправляется, и приходит, но файл создаётся пустым(((
отправка: (сори за кривоватый код) Код: QFile file(fileName); Приём: Код: QTcpSocket *clientSocket = (QTcpSocket *)sender(); мне кажется я чето намудрил с чтением данных из сокета Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 10:43 Извини, но какая то у тебя извращенная передача файлов. глянь на фортун сервер из примеров кутишных и сделай по примеру
Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 18:38 так по его примеру и пытался делать, тока каким образом передать большой файл(около 10МБ)?? нельзя же его просто засунуть в сокет? или всётаки можно? (тогда все упроститься)
Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 18:48 засунь, а на той стороне считывай пока не получишь весь файл
Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 18:50 Код: out << quint16(0) << QString("file") << QFileInfo(file.fileName()).fileName() << file.size() << "сам файл"; Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 18:58 интересно... и скока так получиться отправить? на скока озу хватит?
Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 18:59 хоть сколько)
Название: Re: Отправить файл по сети Отправлено: BRE от Февраль 16, 2012, 19:03 хоть сколько) И для хранения размера пакета хватит quint16? ::)Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 19:03 хоть сколько) И для хранения размера пакета хватит quint16? ::)вечерняя невнимательность) это не ко мне вопрос, а к автору) Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 19:05 спс, заюзаю quint64, получается файл читается порционно, по мере необходимости и не занимая много памяти?
Название: Re: Отправить файл по сети Отправлено: merke от Февраль 16, 2012, 19:10 спс, заюзаю quint64, получается файл читается порционно, по мере необходимости и не занимая много памяти? ну да. а как ты это сделаешь по другому, в любом случае все придется читать паками. Просто на передающей стороне скидываешь весь объем в сокет, тот сам уже бьет на пакеты и пересылает, а на принимающей стороне достаточно получить размер ожидаемых данных и принимать до усраки, пока всё не получишь. Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 19:14 спс, щас попробую, а принимать получается вот так:
while(done < size) ? или как то иначе? Название: Re: Отправить файл по сети Отправлено: BRE от Февраль 16, 2012, 19:17 Для такой отправки файл придется загрузить в память полностью, а это не всегда возможно, поэтому если нужна универсальность, то резать на части и отправлять частями.
Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 19:38 частями то я отправил вроде... а вот как это дело принять потом?
Название: Re: Отправить файл по сети Отправлено: BRE от Февраль 16, 2012, 19:39 частями то я отправил вроде... а вот как это дело принять потом? В смысле?Получил кусок - дописАл в файл, получил следующий - еще дописАл. :) Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 20:22 т.е. когда приходит имя файла и его размер, создавать сам файл, и выходить из readyRead(), а потом когда начнут приходить остальные куски (т.е. будет вызываться readyRead()) писать их в файл?
Название: Re: Отправить файл по сети Отправлено: neversleep от Февраль 16, 2012, 21:18 т.е. когда приходит имя файла и его размер, создавать сам файл... И НЕ выходя из readyRead в цикле получаешь содержимое файла.Код
Название: Re: Отправить файл по сети Отправлено: BRE от Февраль 16, 2012, 21:26 И НЕ выходя из readyRead в цикле получаешь содержимое файла. Для чего этот экстремализм? Для чего останавливать программу на время чтения одного файла? А если нужно получать сразу 100 файлов? :)Пришла полная секция - запиши ее в файл. Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 16, 2012, 22:29 спс, а что если в отдельном потоке это запустить?
2BRE: что значит пришла полная секция? и как поймать данное событие Название: Re: Отправить файл по сети Отправлено: BRE от Февраль 16, 2012, 22:42 2BRE: что значит пришла полная секция? и как поймать данное событие На одной стороне:- читаешь из файла кусок (например 256 Kb) - готовишь пакет: <размер куска> <данные куска> - отправляешь данный пакет - повторяешь, пока не закончиться файл На другой стороне, при приходе пакета в слоте обрабатывающем сигнал readyRead: - размер доступных для чтения данных меньше числа для хранения размера куска - выходим из слота - читаем размер куска - размер доступных для чтения данных меньше размера куска - выходим из слота - читаем кусок в буфер - записываем буфер в файл - выходим из слота Название: Re: Отправить файл по сети Отправлено: neversleep от Февраль 17, 2012, 06:36 И НЕ выходя из readyRead в цикле получаешь содержимое файла. Для чего этот экстремализм? Для чего останавливать программу на время чтения одного файла? А если нужно получать сразу 100 файлов? :)Пришла полная секция - запиши ее в файл. Название: Re: Отправить файл по сети Отправлено: RomiX от Февраль 17, 2012, 08:22 спс! как попробую напишу
|