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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщения через Indy. Проблемы передачи в Интернет, Блокировка роутером, внешние IP? 
:(
    Опции темы
DaptlOM
Дата 20.10.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток всем участникам форума!
При написании программы, позволяющей обмениваться двум пользователям сообщениями в сети, возникли проблемы при работе с Интернет. 
Структура программы - клиент и сервер в одном приложении, т.е. прямая передача сообщения. При написании программы использовал компоненты Инди.

Вначале опишу что на данный момент достигнуто:
1. Программа хорошо себя чувствует в локальной сети (имеется роутер).
2. В Интернет посылает сообщения только после того, как я указываю в параметрах роутера порт, который использует программа (т.е. прописываю, что данный порт является public).
2.1. Программа посылает и принимает сообщения, посланные через Интернет (глобальный IP) на свой же компьютер.
2.2. Отсылал прогу двум людям, у них тоже роутеры, но совести заставлять их лезть в настройки не хватило, да и неудобно будет пользователям использовать такую программу. Без дополнительных настроек они спокойно посылают сообщения мне, программа, запущенная на моем компьютере их получает, но послать сообщения им я не могу. Пишет ошибку 'Socket Error # 10061' - как я понял - ошибка подключения к серверу. 

Мои предположения:
1. Проблема роутера - просто программе нужно, чтобы каждый ручками открыл нужный порт.
2. У людей, которым я отсылал нет внешнего IP (это я вычитал здесь http://forum.vingrad.ru/topic-247404.html), в чем я сильно сомневаюсь, там как у одного из них Акадо.

В чем я прошу помощи:
1. Если проблема все-таки в роутере, как сделать так, чтобы программа нормально передавала сообщения без прямого вмешательства пользователя. Я использую любой порт из нестандартных, лишь бы он не был определен другими приложениями и был прописан в роутере (ну, хотя бы 34510). При попытке прослушивания стандартных портов 80 и 443 сервер просто вырубается. К сожалению у меня нет достаточного опыта работы с сетями, чтобы понять из-за чего это, но мне кажется, что причиной служит мусор с других приложений, использующих эти порты, и стандартный индевский сервер просто не справляется.
Хотелось бы понять, что можно здесь сделать, ведь такие мессенджеры, как та же ася, справляются с этой задачей без вмешательства со стороны пользователя.
Отдельно хочу сказать о скайпе: у него вообще порт, который он использует (он у всех разный, например 34867), пока скайп включен, определсяется сайтом utorrent как открытый. Вот интересно, как он его так открывает без усилий со стороны пользователя. 

Код сервера и клиента привожу ниже:

Клиент:
Код

DWORD WINAPI send_msg (LPVOID)
{
        FMain->IdTCPClient1->Host = ses.get_ip();
        try
        {
          try
          {
            //подключение - здесь выходит ошибка (если не может пробиться к IP)
            FMain->IdTCPClient1->Connect();

            //предача сообщения
            FMain->IdTCPClient1->WriteLn(set.get_Omyname());
            enc.set_string(enc.Ansi_to_Str(ses.get_mmes()));
            FMain->IdTCPClient1->WriteLn(enc.get_encr_string());
            //конец передачи сообщения

          }
          catch (...)
          {
            FMain->M_hist->Lines->Add("Ошибка передачи - попробуйте снова или смените IP получателя.");
          }
        }
        __finally
        {
          FMain->IdTCPClient1->Disconnect();
        }

        return 0;
}



Сервер:
Код

void __fastcall TFMain::IdTCPServer1Execute(TIdPeerThread *AThread)
{
        if (!Application->Active)
        {
                Timer1->Enabled = true;
        }
        try
        {
          try
          {
            //чтение сообщения
            ses.set_user_name(AThread->Connection->ReadLn());
            ses.set_mmes(AThread->Connection->ReadLn());
            //конец чтения сообщения

            if (set.get_Osetip())
            {
              ses.set_ip(AThread->Connection->Binding->PeerIP);
              E_ip->Text = ses.get_ip();
            }
            write_msg();
          }
          catch (...)
          {
            M_hist->Lines->Add("Ошибка приема данных. Проверьте соединение.");
          }
        }
        __finally
        {
          AThread->Connection->Disconnect();
        }
}


P.S. Спасибо всем, кто отзовется!
P.P.S. И еще - это плохо, что у меня дисконнект после каждой передачи/приема сообщения?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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