Название: Клиент не может соединиться с сервером Отправлено: 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-порт), узнает адрес сервера и устанавливает соединение. Как-то так.
|