| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Клиент-сервер: передача данных через интернет |
| Автор: Saviour 28.3.2010, 12:52 | ||
Общеизвестная простая задача (реализация эхо-сервера). Есть локалка и выход в интернет. IP-адрес в интернете динамический (привязала его к хосту через dyndns). Кусок кода сервера:
Если раскомментить строку, то все прекрасно: определяю свой сетевой адрес (192.168.x.x; значение h->h_name - сетевое имя компа; вроде все нормально), связываю с ним сокет. Код клиента аналогичный. Таким образом, в локалке все работает. Не получается связать сокет с внешним IP. Запускаю сервер - bind(...) возвращает не ноль. Где я натупила - в коде или в настройках DynDNS Updater (которые я не трогала за исключением того, что в Settings->Groups добавила свой акк на dyndns.com и выбрала нужный хостнейм)? Нужно ли пробрасывать порт 2342 в настройках модема (на всякий случай пробросила и разрешила его в брандмауэре) или можно без этого обойтись? PS: bind возвращает ошибку 10049 - WSAEADDRNOTAVAIL |
| Автор: GoldFinch 31.3.2010, 19:04 |
| Saviour, может gethostbyname возвращает не один ip, а первый в списке просто не подходит? |
| Автор: darkmamba 31.3.2010, 19:22 |
| gethostbyname может вообще ничего не возвратить, нужно поставить проверку. Помоему биндить нужно на свой внутренний а на роуторе уже разруливать, поидее забиндится должно без косяков -> ошибка в определении ИП ? |
| Автор: Олег2005 31.3.2010, 20:20 |
| Обычно принято биндить на серверный адрес INADDR_ANY - интерфейс выбирает сам стек. И для сервера не необходимости вызывать h=gethostbyname(SERVER); Никакой...... Если хочется узнать IP-адрес, по которому прошел bind() - getsockname() |