![]() |
|
![]() ![]() ![]() |
|
shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Добрый!
Пишу проект, в котором надо организовать работу с сетью по принципу чата. Сетевые приложения писал, но на оригинальном C. Пробовал писать, используя QTcpServer и QTcpSocket. Задача не совсем тривиальна - в хелпе похожего не нашел, а догадки переделки Fortune клиента и сервера плодов не дали. Цель. На машине запускается сервер(адрес и порт известны). Сервер должен слушать порт и получать сообщения от клиентов. Возможная реализация. Клиент стучится на порт сервера, посылает ему строку(это на самом деле сетевой логгер). Сервер ее получает, клиент отсоединяется. Сервер обрабатывает полученные данные и пишет в лог. Проблемы. Не понимаю как это чудо реализовать. Пробую уже почти с неделю. Код приводить не имеет смысла ибо бред, если честно. Google ничего путного не сказал акромя Simple Network Chat. При беглом анализе кода посчитал, что пример не подходит, перегружен. Возможно (даже желательно), клиент должен висеть на порту постоянно, пока работает. Как делать - тоже загадка. Думаю, кусок клиента и сервера должен быть при такой реализации достаточно простым. Заранее спасибо. Все вопросы или необходимые уточнения приветствуются. Как и критика. --------------------
shadowmoon |
|||
|
||||
Ches |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 19.8.2008 Репутация: нет Всего: 3 |
||||
|
||||
shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Хм... А мона UDP на TCP изменить? В проге важно, чтобы пакеты точно дошли до пункта назначения.
--------------------
shadowmoon |
|||
|
||||
Ches |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 19.8.2008 Репутация: нет Всего: 3 |
Можно, но просто заменить в тексте "Udp" на "Tcp" не получится.
з.ы. у меня в локалке юдп пакеты не теряются. Если юдп не с гарантированной доставкой, это не значит, что он не работает. Не стоит использовать TCP не обоснованно |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Посмотри Loopback Example, думаю его можно чуток доработать, чтобы не только с локалхостом работал.
|
|||
|
||||
shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Спасибо за ответы. Буду разбираться. По результатам отпишусь.
--------------------
shadowmoon |
|||
|
||||
shutffl |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Взял за основу Loopback.
test_net_serv.h:
test_net_serv.cpp:
test_net_cli.h:
test_net_cli.cpp:
И сервер, и клиент выводят сообщения (один, что подключился; другой, что есть клиент). Данных нет. --------------------
shadowmoon |
||||||||
|
|||||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
А оригинальный example работает ? Посмотри в консоли, может ругается где-нибудь на коннекты.
|
|||
|
||||
shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Оригинал работает. Какая-то ошибка у меня.
--------------------
shadowmoon |
|||
|
||||
shutffl |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Коль никто и ничего путного не добавил, добавлю я.
Пример клиент-сервера на основе Loopback. Протокор TCP. test_net_serv.h
test_net_serv.cpp
test_net_cli.h
test_net_cli.cpp
Вот так оно выглядит после старта: ![]() --------------------
shadowmoon |
||||||||
|
|||||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Я бы вчера позаморачивался, но уж больно лень было копировать исходники из форума, создавать файлы, .pro файл. Если бы выложил аттачем, то другое дело.
В чем ошибка в итоге была у тебя ? Что-то мне не верится что дело в server->close(). Как ни старался не нашел я в этом методе закрытия сокетов клиентов, только работа со списком очередей. Вообще написано, что сокет должен сразу отправлять данные при возвращении в QEventLoop. Но кто знает, может быть слово типа "hey" слишком короткое и сокет ждет, когда буфер данных наполнится. Это сообщение отредактировал(а) SABROG - 27.11.2008, 12:01 |
|||
|
||||
shutffl |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 18.8.2008 Репутация: нет Всего: 3 |
Вот так вот, из-за лени, люди не могут узнать или понять что-то новое))))
По теме. Если честно, точно сказать не могу, что я сделал, чтобы оно заработало. Конкретно было сделано: 1. Исправил readReady() на readyRead(). Зверский косяк. 2. Добавил в клиент connect(client, SIGNAL(readyRead()),this,SLOT(GetMessage())); 3. Добавил в сервер client->write("hey"); 4. Добавил в сервер connect(server, SIGNAL(readReady()),this,SLOT(GetMessage())); Вроде, все. Вообще, изначально планировалось, что клиент просто подключается и отсылает сообщение, без протокольного взаимодействия с сервером (т.е. сервер ничего явно посылать не должен). Поэтому появилась идея сделать заглушку на обмене (пункт 2). А вывод сообщения сделан только для тестирования. Сами понимаете, мона было и не писать в TextEdit ничего. На самом деле, в клиенте его даже не было изначально. Тупо форма была. Проекты добавил. PS. Я понимаю, что я на этом форуме как крестьянин до отмены крепостного права. Но не кажется ли публике, что форум создан для получения информации? Если есть еще какие-то замечания по коду - буду рад услышать. Это сообщение отредактировал(а) shutffl - 28.11.2008, 13:29 Присоединённый файл ( Кол-во скачиваний: 150 ) ![]() --------------------
shadowmoon |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Скорее не из-за лени, а из-за того, что искать косяк не так интересно, как придумывать велосипед. Если все работает и ты получил ответ, то какие могут быть замечания по коду ? Или ты хочешь направить свой код в качестве example'a в Нокию, чтобы они его включили в дистрибутив ? Пометь тему решеной, если вопросов больше нет. |
|||
|
||||
timofius111 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 20.6.2011 Репутация: нет Всего: нет |
Добрый вечер!
Сразу скажу, что во всём, что связано с сетью, я дичайше нуб( В общем нужно сделать на qt самый простой сетевой чат. Если я всё правильно понял, вышеприведённый чат мне вполне подходит. Он скомпилился (сначала сервер, потом клиент), вроде они законнектились (сервер написал, что всё ок, есть новый клиент). Одного не пойму, как отправлять сообщения? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |