Program klient serwer a zapora windows

0

Witam piszę program klient - serwer, użyłem komponentów TServerSocket oraz TClientSocket, jak łączę się przez adres sieci wewnętrznej (po lanie) to wszystko jest ok, natomiast jak wpisze adres zewnętrzny to już sie klient z serwerem nie łączy. Mam w domu router ale to już chyba standard. Dodatkowo przy pierwszym uruchomieniu programu serwer na komputerze wyskakuje okno zapory Windows z info czy pozwolić programowi na nasłuchiwanie połączeń przychodzących.

Pytania:

  1. Jaka może być przyczyna braku połączenia przy IP zewnętrznym / publicznym?
  2. Jaka jest różnica między TServerSocket - TClientSocket oraz TTcpServer - TTcpClient?
  3. Jak ominąć / dodać regułę do zapory Windows bez wyświetlania na ekranie informacji o nasłuchiwaniu połączeń przychodzących przez program?
0

I nie działa nawet jeśli dodasz (choćby ręcznie) regułkę do zapory?

Co do automatu to zobacz tutaj – https://stackoverflow.com/questions/9180348/delphi-7-windows-vista-7-firewall-exception-network-locations

0

W lanie jak zaakceptuje info od zapory by puszczał połączenia to działa a jak łacze sie przez ip publiczne to dostaje "Asynchronous socket error 10060" nie pokazuje sie info z zapory.

edit:
mam problem z kodem który podałeś w linku

const
  NET_FW_PROFILE2_DOMAIN  = 1;
  NET_FW_PROFILE2_PRIVATE = 2;
  NET_FW_PROFILE2_PUBLIC  = 4;
  NET_FW_IP_PROTOCOL_TCP  = 6;
  NET_FW_ACTION_ALLOW     = 1;
var
  fwPolicy2      : OleVariant;
  RulesObject    : OleVariant;
  Profile        : Integer;
  NewRule        : OleVariant;
begin
  Profile             := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC;
  fwPolicy2           := CreateOleObject('HNetCfg.FwPolicy2');
  RulesObject         := fwPolicy2.Rules;
  NewRule             := CreateOleObject('HNetCfg.FWRule');
  NewRule.Name        := Caption;
  NewRule.Description := Caption;
  NewRule.Applicationname := Executable;
  NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP;
  NewRule.Enabled := TRUE;
  NewRule.Profiles := Profile;
  NewRule.Action := NET_FW_ACTION_ALLOW;
  RulesObject.Add(NewRule);

Dokładnie w miejscu NewRule.Applicationname := Executable; przy próbie kompilacji mam błąd: undeclared identifer Executable, musze dodać jakiś uses do programu?

1

Caption to nazwa reguły w zasadzie dowolna (pod tą nazwą zostanie zapisana reguła) a Executable to nazwa wraz ze ścieżką pliku, który dodajesz do wyjątków zapory.

10060 albo blokada połączenia (firewall) albo w ogóle klient "nie widzi" adresu serwera łatwo sprawdzić czy działa choćby ping od klienta na komp serwera (jak coś to pomoże przekierowanie portów na ruterze).

Nie wiem jakiej wersji Delphi używasz ale obie klasy raczej nie dzisiejsze a już zdecydowanie nie powinno się używać TServerSocket i TClientSocket ponieważ pochodzą z modułu ScktComp, który od dawna jest przestarzały (deprecated) i zostały one zastąpione właśnie przez TTcpServer i TTcpClient. Obecnie pisząc aplikację jeżeli nie chcemy nic co trzeba osobno doinstalować to można użyć odpowiednich komponentów Indy czyli TIdTCPServer i TIdTCPClient.

0
wujek samozuo napisał(a):

Mam w domu router ale to już chyba standard.

A w jakim kierunku się łączysz? Serwer stoi za routerem, czy serwer stoi gdzieś w internecie i próbujesz się ze swojego komputera podłączyć. Bo troszkę niedokładnie to opisałeś. Jeśli serwer stoi za routerem to trzeba przekierować porty. Inaczej nie pójdzie.

0

@kAzek Rozumiem że słowo 'Caption' mogę zastąpić dowolnym słowem natomiasc 'Executable' tak jak napisałeś nazwą programu wraz z jego ścieżką?
Używam Delphi 7 tak jak to oznaczyłem tagiem w temacie.
Odnośnie 'TServerSocket' przestarzały znaczy bezużyteczny czy raczej o słabych możliwościach?

@Mr.YaHooo serwer i klient jest na tym samym kompie z Vistą za routerem, ale to może być wina mojego neta z netii coś to mam nie tak bo pomimo przekierowania portów nie moge postawić serwera www ftp itp. Musiał bym spróbować na innym łączu.

0

@wujek samozuo tak dobrze rozumiesz (z tym że Caption nie tylko pojedynczym słowem ale i zdaniem) a co do tego że przestarzałe to nie tylko słabe możliwości ale istnieje także ryzyko, że na nowych systemach coś nie zadziała jak powinno ale to dotyczy tak samo starej wersji Delphi. Po prostu to było w czasach Windows XP i na tym systemie było oficjalnie testowane ale może nie będzie problemu.

0

Zrobiłem tak:

procedure TForm1.FormActivate(Sender : TObject);
const
  NET_FW_PROFILE2_DOMAIN  = 1;
  NET_FW_PROFILE2_PRIVATE = 2;
  NET_FW_PROFILE2_PUBLIC  = 4;
  NET_FW_IP_PROTOCOL_TCP  = 6;
  NET_FW_ACTION_ALLOW     = 1;
var
  fwPolicy2      : OleVariant;
  RulesObject    : OleVariant;
  Profile        : Integer;
  NewRule        : OleVariant;
begin
  Profile             := NET_FW_PROFILE2_PRIVATE OR NET_FW_PROFILE2_PUBLIC;
  fwPolicy2           := CreateOleObject('HNetCfg.FwPolicy2');
  RulesObject         := fwPolicy2.Rules;
  NewRule             := CreateOleObject('HNetCfg.FWRule');
  NewRule.Name        := 'serwer';
  NewRule.Description := 'reguła przepuszczania serwera';
  NewRule.Applicationname := 'C:\ścieżka_do_pliku\nazwa_pliku.exe';
  NewRule.Protocol := NET_FW_IP_PROTOCOL_TCP;
  NewRule.Enabled := TRUE;
  NewRule.Profiles := Profile;
  NewRule.Action := NET_FW_ACTION_ALLOW;
  RulesObject.Add(NewRule);
end;

Po odpaleniu dostaję okno małe z nazwą programu w nagłówku oraz treścią "odmowa dostępu" oraz pojawia sie okno zapory windows z info iż program chce nasłuchiwać połączenia przychodzące. Wszystko działa jak odpale program z prawami administratora

0

No i tak ma być w systemach nowszych niż XP (a może z XP włącznie - nie pamiętam) nie dodasz reguł do zapory bez praw admina.
Tylko nie wiem czy za każdym uruchomieniem próbujesz dodać regułę czy sprawdzasz czy już takiej nie ma, poza tym sprawdź w ustawieniach zapory czy reguła została dodana poprawnie.

0

Za kazdym razem sprawdzam czy revula zostala dodana i pozniej ew ja kasuje by sprawdzic ponownie czy program dziala poprawnie. Zatem treba odpalic program z prawami admina bez admina

1
wujek samozuo napisał(a):

@Mr.YaHooo serwer i klient jest na tym samym kompie z Vistą za routerem, ale to może być wina mojego neta z netii coś to mam nie tak bo pomimo przekierowania portów nie moge postawić serwera www ftp itp. Musiał bym spróbować na innym łączu.

Ale to nic, sprawdź czy przypadkiem router Netii nie blokuje. Moim zdaniem i tak próba łączenia się z komputerem po IP zewnętrznym powoduje próbę łączenia się z routerem/modemem. A postawić www/ftp nie dasz ray właśnie z powodu braku przekierowania. Na próbę wstaw swój komputer do DMZ i zobacz czy nie pójdzie. Moim zdaniem pójdzie.

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