TCP соединение с двумя сетевыми картами в ПК

Вопросы программирования и использования среды Lazarus.

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

Ответить
Nikolas
новенький
Сообщения: 14
Зарегистрирован: 26.08.2014 13:41:37

TCP соединение с двумя сетевыми картами в ПК

Сообщение Nikolas »

Здравствуйте.
У меня в компьютере установлены две сетевые карты и требуется организовать подключение своего клиента к серверу, подключенному к одной из этих карт.
Правильно ли я делаю это таким образом:

Код: Выделить всё

if idTCPClient1.Connected then begin
    IdTCPClient1.Disconnect;
    btnConnect.Caption:='Disconnected';
  end
  else begin
    idTCPClient1.BoundIP:= edClient.Text;              // 192.168.10.1 IP сетевой карты через которую работаем
    IdTCPClient1.BoundPort:= StrToInt(edit2.Text); // 3344   порт через который работаем         
    IdTCPClient1.Host := edServer.Text;                 // 192.168.10.20 IP сервера, на который передаем команды
    IdTCPClient1.Port := StrToInt(edit2.Text);         // 3344 порт сервера
    try
      IdTCPClient1.Connect;
      btnConnect.Caption:='Connected';
    except
      IdTCPClient1.Disconnect;
      btnConnect.Caption:='Disconnected';
    end;
  end;             


В принципе этот код работает, но возникла проблема - при первом подключении/ отключении все нормально, если сразу попытаться сделать это во второй раз, то выскакивает ошибка 10048 https://support.microsoft.com/ru-ru/kb/173619/ru. При наличии в ПК одной сетевой такой ошибки не возникало.

П.С. Подскажите, каким кодом перехватываются коды ошибок и выводятся "расшифрованные" сообщения об ошибках на экран при работе программы?

П.П.С, Внимательно перечитал статью, проблема решена - машинный перевод "Единственным выходом является использование определенного локального порта" ввел меня в заблуждение т. к. следовало читать "Единственным выходом является использование ОСОБОГО локального порта" т. е.

Код: Выделить всё

IdTCPClient1.BoundPort := 0
.
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Сообщение Pavia »

Вам надо два IdTCPClient и не надо трогать локальные порты.

Nikolas писал(а):П.С. Подскажите, каким кодом перехватываются коды ошибок и выводятся "расшифрованные" сообщения об ошибках на экран при работе программы?

try except
Nikolas
новенький
Сообщения: 14
Зарегистрирован: 26.08.2014 13:41:37

Сообщение Nikolas »

Два клиента? Зачем? А как я узнаю через какую сетевую какой из них будет работать?
Аватара пользователя
Pavia
постоялец
Сообщения: 290
Зарегистрирован: 07.01.2011 11:46:51

Сообщение Pavia »

Nikolas писал(а):А как я узнаю через какую сетевую какой из них будет работать?

А зачем узнавать?
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

Nikolas писал(а):т. к. следовало читать "Единственным выходом является использование ОСОБОГО локального порта" т. е.

Это не особый порт. Это указание операционной системе выбрать свободный локальный порт. Так и должно быть, для привязки к интерфейсу задаётся только его адрес. Порт для клиентского соединения надо задавать только в очень особенных случаях, типа прохождения через NAT.

P.S. Зачем вы вообще пытаетесь указать программе через какую карту ей работать? Это точно необходимо? В нормальных условиях эти вопросы целиком ложатся на операционную систему и её настройки маршрутизации.
Nikolas
новенький
Сообщения: 14
Зарегистрирован: 26.08.2014 13:41:37

Сообщение Nikolas »

Да, действительно все работает и так. Просто сначала клиент не хотел подключаться к серверу, но как выяснилось это была ошибка на той стороне.
Ответить