Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача файлов через интеренет
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
RazrFalcon
Не сталкивался еще с интернетом в программировании и в этом полный 0.
1) как передать файл через интернет на другой комп
2) как сделать что-то на подобии network-chat из примеров, только для интернета
3) грубо говоря что-то типа Skype/ICQ только в меньших масштабах, только передача сообщений и файлов
PS с чего начать и где можно посмотреть примеры
Алексей1153
С чего начать: поискать и почитать про сокеты и TCP-соединение

Где точно искать не знаю, поисковики в руки. А то и по этому сайту поиск
Litkevich Yuriy
Цитата(RazrFalcon @ 4.7.2010, 19:57) *
1) как передать файл через интернет на другой комп
пример examples\network\ftp
Цитата(RazrFalcon @ 4.7.2010, 19:57) *
2) как сделать что-то на подобии network-chat из примеров, только для интернета
задай себе вопрос, "что такое интернет? и чем он отличается от локалки используемой в примере"
RazrFalcon
Что то особо ничего так и не вышло.
Можно что то конкретней чем "сокеты и TCP-соединение".
Так как что то совсем ничего не понятно, я уже молчу про компиляцию.

У меня есть текст/файл и я посылаю его как-то куда-то и человек с моей же прогой принимает этот самый текст/файл.
Как я вообще узнаю "в сети" он или нет? Как он узнает в сети ли я? Должен ли я знать его IP, так как он у него может быть динамический, что тогда?
Ну все в таком духе. Какие то источники есть? Инет и хелп кьютешный не очень прояснили ситуацию.

Тут в общем то пока даже не QT а понимание, ну и потом перенос на кьют конечно же.
Алексей1153
RazrFalcon, http://ru.wikipedia.org/wiki/TCP
RazrFalcon
Алексей1153, это я читал конечно же уже.
Я так понимаю нужно использовать QTcpServer и QTcpSocket?! Как то...
Алексей1153
RazrFalcon, честно, я ещё с этими классами не успел поработать.

Надо тестовый проект накидать попробовать. У тебя заготовки есть ?
RazrFalcon
Цитата(Алексей1153 @ 13.8.2010, 18:18) *
Надо тестовый проект накидать попробовать. У тебя заготовки есть ?

Да не особо, фактически ничего. Я же так ничего и не написал до сих пор :mellow:
Просто кидал примеры с инета, оно не пахало, и я удалял.
Есть 2-е проги для которых это как раз и нудно в принципе. Одна из них в общем то Network Chat Example. Его то я и хочу сделать "инетовским". Вторая совсем простенькая загрузка страницы.
Так что в этом полный новичек.
Алексей1153
что-то я на такой ерунде споткнулся, что прям не знаю ))
Раскрывающийся текст
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    m_pServer=0;
    m_pClient=0;
}

//создание клиента
void MainWindow::on_pushButton_2_clicked()
{
    if(m_pServer || m_pClient) return;

//    m_pClient=new QTcpSocket(this); //<<<<<<
}


стОит открыть помеченную строчку с new QTcpSocket(this) - компиляторне находит определение класса QTcpSocket, хотя файл подключен. Пробовал и в проект добавлять - одна фигня. Пишет ошибку
Цитата
:: error: collect2: ld returned 1 exit status



в консоли
Цитата
debug/mainwindow.o:E:\test2/mainwindow.cpp:50: undefined reference to `_imp___ZN10QTcpSocketC1EP7QObject'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\test2.exe] Error 1
mingw32-make: *** [debug] Error 2
Процесс "C:/Qt/2010.04/mingw/bin/mingw32-make.exe" завершился с кодом %2.
RazrFalcon
Такие вот куски компилятся, тока не понимаю что это дает
#include <QtNetwork/QTcpServer>
#include <QtNetwork/QTcpSocket>

int m_pServer=0;
int m_pClient=0;

void MainWindow::on_pushButton_clicked()
{
    if(m_pServer || m_pClient) return;
}
Алексей1153
Цитата(RazrFalcon @ 13.8.2010, 23:53) *
Такие вот куски компилятся,

ну это понятно. Только они не int, а указатели на соответствующие классы, а предопределение классов у меня в хедере.
class QTcpServer;
class QTcpSocket;
        
class MainWindow : public QMainWindow
{
    Q_OBJECT

    QTcpServer* m_pServer;
    QTcpSocket* m_pClient;

Но это лишь указатели - они сами по себе не требуют описания класса. А вот стОит начать работать с классом (открыть строку m_pClient=new QTcpSocket(this); ) то начинается фигня. То ли пути где-то ещё надо прописать, но я не нашёл, где

вообще, избалован студией, там всё это проще делается ))
RazrFalcon
Как то мудрено все. Неужели все настолько по кривому. Я конечно молчу про пример с Network Chat, там вообще куча всего.
Неужели ни кто подобным не интересовался, аж странно :blink:
Алексей1153
пример у меня тоже не компилится
Litkevich Yuriy
Алексей1153, в pro-файле добавил соответствующий модуль?
Алексей1153
нет, конечно. А как его туда вписать )) А автоматом Creator не умеет разве ?

Всё, дотумкал ) Спасибо

QT += opengl\
    network



но, ведь, это гвоздец, почему всё так неочевидно


RazrFalcon, я на сегодня всё, уже спать надо начинать ) Завтра поковыряемся
Litkevich Yuriy
Цитата(Алексей1153 @ 14.8.2010, 1:28) *
почему всё так неочевидно
а как ты узнал о:
Цитата(Алексей1153 @ 13.8.2010, 23:57) *
#include <QtNetwork/...
почему-то ты пишешь название модуля, откуда ты знаешь, что есть такой модуль?
Алексей1153
Цитата(Litkevich Yuriy @ 14.8.2010, 0:37) *
почему-то ты пишешь название модуля, откуда ты знаешь, что есть такой модуль?

нашёл, где в инклудах файлы лежат. А потом посмотрел, как в примерах сделано - оттуда и что в PRO вписать определил
Алексей1153
RazrFalcon, вот накидал, только всё очень по минимуму. По идее, нужно классы производить и там функционал писать.

Тут всё по простому сделано - без индикации состояний, без нормального затенения кнопок и всё такое. Можно запустить два экземпляра программы и соединить между собой - фаервол покажет соединение

Можно убедиться в паре программа<->HiperTerminal (или другой терминал, ибо этот жутко глючен)

Пример передачи данных не успел - меня гонят гулять с ребёнком ))

--аттач удалён как неактуальный--
Litkevich Yuriy
Цитата(Алексей1153 @ 14.8.2010, 10:56) *
нашёл, где в инклудах файлы лежат. А потом посмотрел, как в примерах сделано - оттуда и что в PRO вписать определил
а можно было глянуть в справку по модулю, там в подробном описании и говорится о том как его использовать. :)
RazrFalcon
Алексей1153, спасибо, буду разбираться. Только вот сразу вопрос: клиен подключается ко мне по ip, но а если у меня не статический (у меня статический, но у друга нет, он ко мне конектится вроде бы, а я к нему как?); сколько к серверу может подключится человек?
Алексей1153
Litkevich Yuriy, я в креаторе полный ещё чайник :) В Qt тоже, впрочем. Вот сейчас с упоением ковыряюсь в сокетах - скоро пример выложу ))

Цитата(RazrFalcon @ 14.8.2010, 19:51) *
клиен подключается ко мне по ip, но а если у меня не статический (у меня статический, но у друга нет, он ко мне конектится вроде бы, а я к нему как?);

Тут такая штука. Начнём с того, что мои познания в этих делах несовершенны. Но из того, что мне известно,

0) если ты - сервер, то друг всегда может подключится по твоему IP
1) если сервер - друг, то ему можно зайти на myip.ru и сказать текущий IP . Также ему надо настроить маршрут в модеме(или чего там у тебя) с внешнего IP в локальный адрес
2) можно зарегистрировать бесплатное доменное имя, и специальный сервер будет подставлять под него текущий IP, но детали не знаю - это к знающим людям ) Я просто знаю, что такое возможно, на работе так админ сделал

Цитата(RazrFalcon @ 14.8.2010, 19:51) *
сколько к серверу может подключится человек?

столько, сколько разрешишь сервером (метод setMaxPendingConnections()).
Верхняя граница ещё может быть прижата пропускной способностью сети :D
RazrFalcon
Цитата(Алексей1153 @ 14.8.2010, 19:28) *
Тут такая штука. Начнём с того, что мои познания в этих делах несовершенны.

Ну мои знания ограничены всего 4-мя месяцами, так что я тоже новичок. А с инетом/сетью вообще знаний нет, я имею ввиду именно в программировании.
Цитата
то ему можно зайти на myip.ru и сказать текущий IP

Это понятно, просто интересно как это делают аськи и скайп. <_<
Хотя у них там еще логин-пароль используется.
Алексей1153
Цитата(RazrFalcon @ 14.8.2010, 22:56) *
просто интересно как это делают аськи и скайп.

Все аськи и скайпы - это клиенты. У них есть сервера - вот они их разруливают.
Алексей1153
RazrFalcon, пока ещё я не добился всего, что хотел, но почти доделал ) Выкладывать сырое не хочу, поэтому завтра. Ещё борюсь с набором сигналов этих классов
Алексей1153
RazrFalcon, вот, что у меня получилось. Потестируй, может ещё глюки найдёшь ))) И всё-таки, хотелось бы потом переделать в виде производных классов, пока некогда
RazrFalcon
Цитата(Алексей1153 @ 15.8.2010, 15:36) *
Потестируй, может ещё глюки найдёшь

Тестирую...
Пока тока один баг, как и в предыдущем проэкте.
1) почему QT += opengl network, зачем Gl непойму, у меня на него ругается вида :: error: cannot find -lGL
Система Ubuntu 10.04. Я то понимаю что его не находит, тока почему не пойму :huh:, ведь он как бы есть, кстати как это проверить :)
Алексей1153
У меня система WXP SP3
Почему ругается - не знаю

Попробуй решить проблему "в лоб" - создай новый проект и кинь туда файлы *.h, *.cpp, *.ui из этого

ой, "pro" не надо, конечно же ))
RazrFalcon
Алексей1153, я имел ввиду зачем тебе opengl вообще, ты же его не используешь, а решается все просто стиранием его и все пашит.
Просто у меня OGRE движок тоже вечно кричит что нет ligOGL.so.2.0 (при том что он есть) что то в этом духе, вот я и думаю что же я с opengl натворил.
Алексей1153
RazrFalcon, это креатор при создании вписал, я вручную только network добавил )

Стёр opengl - тоже компилится и работает )

С классами то разобрался ?
RazrFalcon
Цитата(Алексей1153 @ 15.8.2010, 16:09) *
С классами то разобрался ?

Ну в общем то понятно. Пару вопросов разве что:
1) "включение слушалки" - это что? Проверяем на наличие клиентов?
2) delete m_pServer; - такую запись никогда не встречал.
3) if(!m_pServer)return; - на что проверка?!
4) m_pPeer__=0; - что это делает?
5) я так понял читает только 100 байт? И это только текст.
6) ну и последние, передачу файлов еще ты не писал, по крайней мере я не нашел.
Огромное спасибо, буду разбираться дальше. Интересно б присобачить потоковое видео через openCV еще. Но это уже больше к передаче файлов.
Алексей1153
Цитата(RazrFalcon @ 15.8.2010, 20:27) *
включение слушалки

когда сокет-сервер создаётся, он инертен, сам по себе он ничего ещё не делает. Когда вызывается listen() , сервер начинает слушать входящие запросы на соединение от клиентов. Причём, обратной дороги нет - он будет слушать до талого снега! Если только не пересоздать хендл сокета в системе (по крайней мере так в винде). В студии я делал это через close()/create() сокета сервера, а в Qt это не прокатит, как так пАрные сокеты убьются. Тут, наверное, достаточно вызвать setMaxPendingConnections(0) для отключения слушалки совсем. Хотя, не проверял, что при этом произойдёт ))

Цитата(RazrFalcon @ 15.8.2010, 20:27) *
delete m_pServer; - такую запись никогда не встречал.

это всего лишь оператор C++ , возвращает в кучу память, выделенную под объект оператором new. В библиотеке Qt есть расслабуха - если класс произведён от QObject и имеет родителя, то delete автоматом вызывается для объекта. Но иногда удалить объект надо не затрагивая родитель.

Цитата(RazrFalcon @ 15.8.2010, 20:27) *
if(!m_pServer)return; - на что проверка?!

булево выражение (!X) эквивалентно (X==0)

Цитата(RazrFalcon @ 15.8.2010, 20:27) *
m_pPeer__=0; - что это делает

обнуляет указатель m_pPeer__. Странный вопрос...

Цитата(RazrFalcon @ 15.8.2010, 20:27) *
я так понял читает только 100 байт? И это только текст.

производится попытка чтения из приёмного буфера сокета максимум 100 байтов за раз - да
Это количество зависит от задачи, для данного примера сойдёт и константа 100 ))

Цитата(RazrFalcon @ 15.8.2010, 20:27) *
ну и последние, передачу файлов еще ты не писал, по крайней мере я не нашел.


так я сделал передачу строки - не нашёл что ли ?
А строка - это набор байтов. А файл тоже. Но большие объёмы данных могут потребовать спец-приёмов при передаче - это когда столкнёшься, сам увидишь, пока передавай всё разом )

Как потоковое видео приделать, я не знаю, но суть такая же - передаётся часть видеопотока, потом эта часть проигрывается, а в это время качается очередная часть
RazrFalcon
Цитата(Алексей1153 @ 15.8.2010, 18:41) *
обнуляет указатель m_pPeer__. Странный вопрос...
То есть количество пиров становится 0, отключаем клиентов как я понял. Я имел ввиду логику выражения, то что обнуляем я понял, не понял что.
Цитата
так я сделал передачу строки - не нашёл что ли ?
Ну строку то я нашел, но думал она строго на текст, теперь разобрался.
Еще раз спасибо, буду прикручивать сюда что хотел, потом выложу готовый вариант.
Алексей1153
Цитата(RazrFalcon @ 15.8.2010, 22:36) *
То есть количество пиров становится 0

Срочно читать что-нибудь вроде "C++ для начинающих" - раздел про указатели!
RazrFalcon
Цитата(Алексей1153 @ 15.8.2010, 19:41) *
Срочно читать что-нибудь вроде "C++ для начинающих" - раздел про указатели!

Все понятно-понятно :)
Алексей1153
Расскажи, что именно понятно :)
RazrFalcon
Цитата(Алексей1153 @ 15.8.2010, 19:49) *
Расскажи, что именно понятно :)
Понятно ровно столько - сколько нужно. Не люблю уж сильно вникать, хотя может это и проблема. Просто пользуюсь теми методами которые устраивают. Никогда к примеру указателями и структурами не пользовался, не по мне, ищю другие варианты, да и классы не люблю. По крайней мере пока устраивает.
Алексей1153
RazrFalcon, нууу, крайне неверная позиция :) Дело в том, что классы, структуры (да и указатели) - не методы, это основы языка C++

Если ты пишешь на этом языке программы - ты просто обязан хорошо знать эти вещи.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.