Russian Qt Forum

Qt => Работа с сетью => Тема начата: merke от Сентябрь 28, 2010, 11:34



Название: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 11:34
Всем привет!

Есть приложение клиент-сервер, работают они в пределах одной локальной сети. сервер слушает на QHostAddress::Any, 1234
Клиент коннектится следующим образом connectToHost(QHostAddress::LocalHost, 1234)

Если запускать север и клиентов на одной машине то всё работает. Если же сервер поставить на отдельный компутер, а клиенты на другие и попробовать соединиться, то ни чего не происходит.

Можете подсказать, в чем может быть проблема?



Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 11:46
Цитировать
Клиент коннектится следующим образом connectToHost(QHostAddress::LocalHost, 1234)
LocalHost - это компьютер клиента (замыкание сам на себя или 127.0.0.1)


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 11:49
А что советуете тогда в этом случае?


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 11:52
А я думаю LocalHost Это и есть локалка или я ошибаюсь?


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 11:53
использовать
Код:
connectToHost(QHostAddress("реальный IP сервера"), 1234)
например
Код:
connectToHost(QHostAddress("192.168.1.100"), 1234)


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 11:55
А я думаю LocalHost Это и есть локалка или я ошибаюсь?
ошибаетесь, причем весьма сильно:
http://doc.qt.nokia.com/4.6/qhostaddress.html#SpecialAddress-enum
В IP-сетях LocalHost всегда обозначает свой компьютер. Это алиас на 127.0.0.1, к которому можно обратиться даже при отсутствии подключения к сети (конечно адаптер должен присутствовать)


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 12:03
Так теперь в клиенте пишу connectToHost(QHostAddress("адрес_серверной_машины"), 1234)

Эффекта ни какого.


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 12:05
1. прямо так, или все-таки указываем адрес?
2. как насчет firewalls? порт на сервере действительно доступен для клиентов?


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 12:09
Сейчас приходится тестировать дома. Стоит два компа, мой ноут соединен с другим компом роутером (Wi-Fi). Сервер стоит на серверной машине, клиент на моем ноуте, пишу connectToHost(QHostAddress(192.168.1.1), 1234)


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 12:10
Нет порты не блокируются!


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 12:13
Попробую догадаться: клиент и сервер в одной локальной сети, образованной интернет-маршрутизатором с wi-fi. Пробую догадываться дальше - маршрутизатор самый обыкновенный, типа ASUS, D-Link и т.п. В таком случае 192.168.1.1 - это адрес самого маршрутизатора, а у сервера ip другой.


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 12:15
Очень верно! Как узнать адрес самого сервера?


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 12:21
Спросить у сервера  ;D Если NetBIOS имя сервера известна (типа "servak1") - сделать пинг по имени, должны получить адрес.
P.S. Qt здесь не причем - это уже работа с TCP/IP-протоколом. Лучше сначала пробовать утилитами самой OS (ping, netstat, ipconfig, nslookup, arp - стандартный набор для Windows).


Название: Re: Клиент не может соединиться с сервером
Отправлено: x-sam от Сентябрь 28, 2010, 12:23
В консоли на машине ipconfig для windows и ifconfig для *nix
или ping имявторогокомпа

з.ы. когда нажимал ответить ответа выше еще не было(:
з.з.ы. а я и не говорил, что на клиенте, конечно же на сервере


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 12:25
В консоли на машине ipconfig для windows и ifconfig для *nix
Только эту команду, к сожалению  >:( , надо выполнить на сервере


Название: Re: Клиент не может соединиться с сервером
Отправлено: crossly от Сентябрь 28, 2010, 13:02
почему к сожалению....?? в добавок ко всему я так понимаю ip по dhcp раздается?? :)


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 13:09
[offtop]
Потому, что сервер может быть физически недоступен - установлен где-то в другом месте, нет доступа и т.п. А вариант с пингом может помочь в такой ситуации (если только на сервере не приняты спец. меры по блокировке icmp и отключению NetBIOS (блокировке служб).
Если у сервера ip динамический - все гораздо хуже. Сработает только на текущую резервацию DHCP (48 часов по-умолчанию на маршрутизаторе).Поможет только статический, либо динамический с резервацией по MAC
[/offtop]


Название: Re: Клиент не может соединиться с сервером
Отправлено: crossly от Сентябрь 28, 2010, 14:18
ну.... во первых... если человек который устанавливает ПО на сервер по определению должен знать его ip.... и по второму... если дописать немного кода серверу и клиенту, то клиент и сам сможет узнать адрес сервера...


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 14:20
Цитировать
если дописать немного кода серверу и клиенту, то клиент и сам сможет узнать адрес сервера...
   
А можно подробнее о таком фокусе?


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 14:25
DHCP + DNS (в локальной сети), DNS (для серверов с выделенным ip в инете, либо при динамическом адресе в инете поможет DynDNS). Это в плане организации. А в плане Qt смотрим http://doc.qt.nokia.com/4.6/network-programming.html#resolving-host-names-using-qhostinfo (смотреть пример по lookupHost).


Название: Re: Клиент не может соединиться с сервером
Отправлено: crossly от Сентябрь 28, 2010, 14:28
1. да DNS.
2. использовать udp broadcast..... клиент шлет датаграмму в сеть.... сервер ловит и сообщает клиенту свой адрес...


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 14:31
Тоже очень хороший вариант - в локальной сети так даже лучше (чтобы не мудрить с поднятием DNS-сервера в локалке)


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 14:34
Так теперь понятно! Спасибо!

Теперь какую функцию вызвать в QTcpServer дабы получить реальный адрес сервера?


Название: Re: Клиент не может соединиться с сервером
Отправлено: crossly от Сентябрь 28, 2010, 14:37
ээ... не совсем понял... для чего на сервере узнавать его же адрес??

сори торможу
Код:
QHostAddress QTcpServer::serverAddress () const


Название: Re: Клиент не может соединиться с сервером
Отправлено: merke от Сентябрь 28, 2010, 14:43
Блин уже после всего дня гоню блин.


Название: Re: Клиент не может соединиться с сервером
Отправлено: Hellraiser от Сентябрь 28, 2010, 14:54
Пусть сервер слушает порт 1234/tcp для обмена данными и порт 1234/udp для ответа адреса (см. здесь http://doc.qt.nokia.com/4.6/network-programming.html#using-udp-with-qudpsocket). По приходу udp-запроса на порт 1234 сервер отвечает по адресу клиента (а его он узнает из 3-го параметра в readDatagram) сообщением со своим ip. Клиент принимает сообщение (значит надо чтобы он тоже слушал определенный udp-порт), узнает адрес сервера и устанавливает соединение. Как-то так.