Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-сервер: передача данных через интернет 
:(
    Опции темы
Saviour
  Дата 28.3.2010, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.4.2009

Репутация: нет
Всего: нет



Общеизвестная простая задача (реализация эхо-сервера). Есть локалка и выход в интернет. IP-адрес в интернете динамический (привязала его к хосту через dyndns). Кусок кода сервера:
Код

#include <winsock2.h>
#define PORT 2342
...   ...   ...
  SOCKET server_socket;
  sockaddr_in local_addr;
...   ...   ...
  server_socket=socket(AF_INET,SOCK_STREAM,0);
  local_addr.sin_family=AF_INET;
  local_addr.sin_port=htons(PORT);
  hostent *h;
  char *SERVER="server.homedns.org";
  in_addr IP_addr;
  char *IP;
//gethostname(SERVER, 128); //для локалки
  h=gethostbyname(SERVER);
  Text_Out("Имя сервера: ");
  cout<<h->h_name<<endl;
  IP_addr.S_un.S_un_b.s_b1=h->h_addr_list[0][0];
  IP_addr.S_un.S_un_b.s_b2=h->h_addr_list[0][1];
  IP_addr.S_un.S_un_b.s_b3=h->h_addr_list[0][2];
  IP_addr.S_un.S_un_b.s_b4=h->h_addr_list[0][3];
  IP=inet_ntoa(IP_addr);
  Text_Out("IP-адрес сервера: ");
  cout<<IP<<endl;
  local_addr.sin_addr.s_addr=inet_addr(IP);
  if(bind(server_socket,(sockaddr*)&local_addr,sizeof(local_addr)))
    return;
...   ...   ...

Если раскомментить строку, то все прекрасно: определяю свой сетевой адрес (192.168.x.x; значение h->h_name - сетевое имя компа; вроде все нормально), связываю с ним сокет. Код клиента аналогичный. Таким образом, в локалке все работает.

Не получается связать сокет с внешним IP. Запускаю сервер - bind(...) возвращает не ноль. Где я натупила - в коде или в настройках DynDNS Updater (которые я не трогала за исключением того, что в Settings->Groups добавила свой акк на dyndns.com и выбрала нужный хостнейм)? Нужно ли пробрасывать порт 2342 в настройках модема (на всякий случай пробросила и разрешила его в брандмауэре) или можно без этого обойтись?

PS: bind возвращает ошибку 10049 - WSAEADDRNOTAVAIL

Это сообщение отредактировал(а) Saviour - 28.3.2010, 22:01
PM MAIL   Вверх
GoldFinch
Дата 31.3.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 1
Всего: 26



Saviour, может gethostbyname возвращает не один ip, а первый в списке просто не подходит?
PM MAIL ICQ   Вверх
darkmamba
Дата 31.3.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 16.10.2008

Репутация: нет
Всего: 1



gethostbyname может вообще ничего не возвратить, нужно поставить проверку.
Помоему биндить нужно на свой внутренний а на роуторе уже разруливать, поидее забиндится должно без косяков -> ошибка в определении ИП ?
PM MAIL   Вверх
Олег2005
Дата 31.3.2010, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Обычно принято биндить на серверный адрес INADDR_ANY - интерфейс выбирает сам стек.
И для сервера не необходимости вызывать  
h=gethostbyname(SERVER);
Никакой......
Если хочется узнать IP-адрес, по которому прошел bind() - getsockname()
PM MAIL WWW MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.