Gdzie w komponencie IdTCPClient znajdę numer portu klienta?

0

Witam. Używam IdTCPClient z Indy Servers i mam pytanie. Nadaje do mnie urządzenie na port 3001 i ok, odbieram te dane. Teraz jednak chciałbym odpowiedzieć a nie wiem gdzie w komponencie znajdę numer portu klienta? Wireshark podpowiada mi np. że klient nadawał z portu 16047 na mój adres i na mój port 3001 i teraz ja chcę odpowiedzieć ale nigdzie nie widzę gdzie mogę uzyskać jego numer portu. A tak przy okazji czym różnią się:

Athread.Connection.Socket.Binding.PeerIP

od

Athread.Connection.Socket.Binding.IP

?

dodanie znaczników <code class="delphi"> - fp

0
  AThread.Connection.Socket.Binding.PeerPort
  AThread.Connection.Socket.Binding.Port
1

jeśli to urządzenie nawiązuje połączenie to po prostu "odpowiedz" do tego samego gniazda, z którego czytasz dane. Jeśli urządzenie się rozłącza po nadaniu danych to musisz poszukać w dokumentacji na jaki port nadawać. BTW port, na którym urządzenie nadaje rzadko kiedy (czy w ogóle są takie przypadki) jest portem, na którym słuch przychodzących połączeń

0

Odnoszę wrażenie że używam niewłaściwego do mojego celu komponentu. Dostaję paczkę TCP z konwertera RS232->LAN. Pierwsza paczka to ogólne zapytanie i IdTCPServer samoistnie odpowiada na nią ACKiem. To jest jeszcze ok. Następna paczka jest podobna ale zawiera 10-znakowy identyfikator DATA na końcu i tutaj powinien być odesłany podobny pakiet z analogicznym identyfikatorem na końcu a tym czasem IdTCPServer odsyła automatycznie klasyczny ACK. Czy da się wyłączyć ten automatyczny ACK? Czy może po prostu zmienić używany komponent na inny bo ten się niezbyt nadaje do takiej komunikacji?

1

W komunikacji klient - server mam małe doświadczenie, bo jeśli coś pisałem to głownie korzystało z HTTP. Jeżeli rozważasz zmianę komponentu, to polecem jeśli nie Synapse, to Simple TCP z www.piechnat.pl - największa możliwość co do kontroli zawartościu pakietów imo, a dużym plusem jest to, że swobodnie to użyjesz w WinAPI. Jęzeli oczywiście zajdzie u Ciebie taka konieczność. A coś więcej przy samej obsłudze pakietów pewnie ktoś tutaj jeszcze coś doradzi.

2

@Excray
Raz chcesz używać IdTCPClient później IdTCPServer tymczasem różnica pomiędzy tymi komponentami jest bardzo wielka.
Na danym komputerze/urządzeniu można postawić tylko 1 serwer na danym porcie np. 3001 jest tak ponieważ klient chcąc się podłączyć do serwera musi znać jego adres IP oraz port.
Serwer może obsługiwać setki klientów zaś klient ma możliwość podłączenia się do 1 serwera (tzn. można nawiązać więcej połączeń, ale potrzebowałbyś kilku komponentów IdTCPClient).

Zatem pierwsze i najważniejsze pytanie czy to "urządzenie" jest serwerem a ty jesteś klientem i to ty masz wskazać adres ip i port pod, który się podłączyć czy odwrotnie.
Kolejna sprawa to protokół TCP/IP, nie zagłębiaj się w to czy jest wysyłany ACK czy nie bo tym ma się zająć warstwa niższa, komponenty korzystają i tak z funkcji bibliotecznych WinSock'a.
No i dochodzimy do sedna czyli protokołu jaki jest wykorzystywany na warstwie TCP/IP. Po połączeniu serwer już nic więcej nie wie o sposobie wymiany danych i tutaj wkraczasz Ty.
Jeśli pierwszy do ciebie wysyła dane klient to sobie je odczytujesz i SAM musisz odesłać to czego oczekuje klient od ciebie tu nic nie zrobi się samo. Dodatkowo pocieszę cie, że pakiety mogą przychodzić sklejone ze sobą lub przychodzić w częściach i musisz sobie obsłużyć takie przypadki. Najczęściej przed właściwymi danymi jest zapisany ich rozmiar lub stosowany jest jakiś terminator pakietu który pozwoli ci ocenić kiedy się pakiet skończył a gdzie zaczyna się kolejny, ale tak jak powiedziałem zależy to od protokołu jakim posługuje się urządzenie.

PS ja preferuje używanie asynchronicznych TServerSocket lub TClientSocket - są wygodne zdarzenia po odebraniu pakietu, nie trzeba bawić się w wątki.

0

Raz chcesz używać IdTCPClient później IdTCPServer tymczasem różnica pomiędzy tymi komponentami jest bardzo wielka.

Bo wydawało mi się że będę potrzebować obu ale chyba się myliłem.

Zatem pierwsze i najważniejsze pytanie czy to "urządzenie" jest serwerem a ty jesteś klientem i to ty masz wskazać adres ip i port pod, który się podłączyć czy odwrotnie.

Ja jestem serwerem a urządzenie jest klientem.

Kolejna sprawa to protokół TCP/IP, nie zagłębiaj się w to czy jest wysyłany ACK czy nie bo tym ma się zająć warstwa niższa

właśnie muszę się wgłębiać bo ta wredna warstwa niższa odsyła nie to co bym chciał. Odsyła zwykły ACK i po chwili klient nie chce już ze mną rozmawiać bo nie tego oczekiwał.

Jeśli pierwszy do ciebie wysyła dane klient to sobie je odczytujesz i SAM musisz odesłać to czego oczekuje klient od ciebie tu nic nie zrobi się samo.

Niestety jednak dzieje się samo. ACK jest odsyłany z automatu i chyba nie mam na to wpływu a chciałbym.

PS ja preferuje używanie asynchronicznych TServerSocket lub TClientSocket - są wygodne zdarzenia po odebraniu pakietu, nie trzeba bawić się w wątki.

Ok, dzięki, zobaczę.

PS> Czy na tym forum naprawdę nie ma czegoś takiego jak cytowanie selektywne???

dodanie znaczników <quote> - fp

0

TCP/IP to pewien standard i naprawdę nie musisz się w niego zagłębiać. Najprawdopodobniej nie odsyłasz do klienta pakietu w takiej formie jak trzeba lub robisz to źle. Bez kodu tutaj niewiele można powiedzieć.

0

Dziękuję wszystkim za pomoc. Udało mi się uruchomić komunikację z komponentem TServerSocket.

1 użytkowników online, w tym zalogowanych: 0, gości: 1