Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Indy UDP klijent-server i broadcast

[es] :: C/C++ programiranje :: Indy UDP klijent-server i broadcast

[ Pregleda: 2300 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Indy UDP klijent-server i broadcast31.10.2009. u 15:14 - pre 176 meseci
Imam jedan čudan problem pri UDP klijent-server komunikaciji (Indy 9). Code je sljedeći:

Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int n = 5;

    C1->SendBuffer(&n, sizeof(int));
    C1->ReceiveBuffer(&n, sizeof(int));
    Label1->Caption = n;
}
void __fastcall TForm1::S1UDPRead(TObject *Sender, TStream *AData,
      TIdSocketHandle *ABinding)
{
    int n;
    AData->ReadBuffer(&n, sizeof(int));
    n++;
    ABinding->SendTo(ABinding->IP, ABinding->Port, &n, sizeof(n)); // ne radi...
    //AData->WriteBuffer(&n, sizeof(int)); // niti ovo...
    //AData->Write(&n, sizeof(int));  // niti ovo..
}


Pokušavam iz UDP klijenta serveru poslati br 5, a da mi server vrati taj isti broj uvećan za 1. Međutim, iz servera se niti na jedan od ova tri načina poruka neće poslati nazad klijentu. Kao da nisam ništa niti napisao. U čemu griješim? Naravno, portovi su identični na klijent i server strani i host je ispravno definiran.

Također, imam desetak UDP servera u labosu i trebao bih pritiskom na gumb znati koji od njih je upaljen a koji ne. Zapravo, to sam mislio napraviti broadcastom, ali ta funkcija kao prvi parametar ima AnsiString, a ja bi trebao serverima poslati ID zahtjeva. Npr. preko broadcasta bi htio svima u mreži poslati br. 50, a svi koji su to primili da mi taj isti broj vrate nazad. Ideje? Inače, ping ne mogu koristiti zbog nekih drugih stvari..
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Indy UDP klijent-server i broadcast31.10.2009. u 18:08 - pre 176 meseci
Prvo moraš da pronađeš gde je problem. Instaliraj Wireshark i utvrdi da li paket uopšte dođe da servera, i da li uopšte izađe iz klijenta.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.adsl.net.t-com.hr.



+9 Profil

icon Re: Indy UDP klijent-server i broadcast31.10.2009. u 18:10 - pre 176 meseci
Paket stigne na server. Problem je što server ne šalje odgovor.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Indy UDP klijent-server i broadcast01.11.2009. u 09:08 - pre 176 meseci
Da li ti server osluškuje? Da li vidiš svoj port kad u konzoli izvršiš "netstat -a -p udp"? Da li možeš da debaguješ server, da li se uopšte izvršava kod u funkciji TForm1::S1UDPRead?
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
87.252.137.*



+9 Profil

icon Re: Indy UDP klijent-server i broadcast01.11.2009. u 09:30 - pre 176 meseci
Vec sam gore napisao da na server stigne paket i to nije problem, vec od servera prema klijentu ne radi.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Indy UDP klijent-server i broadcast01.11.2009. u 10:07 - pre 176 meseci
Da li postoji neka povratna vrednost funkcije, koja bi ti rekla u čemu je greška? Da li možeš debagovanjem da dođeš do SDK funkcije koja zaista šalje paket sa servera? Da li paket izađe iz servera? Uzgred, jesu li klijent i server na istoj mašini? Ako jesu onda Wireshark ne može da ti pomogne tako lako.
 
Odgovor na temu

markom
Marko Milivojević
Network Engineer
Google
Mountain View

Član broj: 18427
Poruke: 4227
*.rezidencija.rs.

Sajt: https://markom.rs


+16 Profil

icon Re: Indy UDP klijent-server i broadcast01.11.2009. u 10:36 - pre 176 meseci
Glupo pitanje. Da li ti je ugašen firewall na klijentima i serveru?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Indy UDP klijent-server i broadcast01.11.2009. u 20:59 - pre 176 meseci
Nisam nikada radio sa Indy UDP, ali na osnovu neke logike, ovda dva poziva:
AData->WriteBuffer(&n, sizeof(int)); // niti ovo...
AData->Write(&n, sizeof(int)); // niti ovo..
... ne vracaju stream NAZAD (klijentu), sto je ocigledno zelja, vec samom sebi u AData.

Mislim da je slicno i za ovo:
ABinding->SendTo(ABinding->IP, ABinding->Port, &n, sizeof(n)); // ne radi...
... tj, da se salju podaci rekurzivno samom serveru, koji to (na osnovu koda) opet prima/salje/prima/salje.

Moguce je da treba pokusati sa:
PeerIP i PeerPort, i videti sta sa BroadCasting-om u smislu True/False.



[Ovu poruku je menjao X Files dana 02.11.2009. u 10:06 GMT+1]
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Indy UDP klijent-server i broadcast02.11.2009. u 09:06 - pre 176 meseci
Ne vidim smisao u tome da server razgovara sa samim sobom. A po ovom primjeru iz Delphija ABinding ima informaciju o pošiljatelju.

Code:
procedure TUDPMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  DataStringStream: TStringStream;
  s: String;
begin
  DataStringStream := TStringStream.Create('');
  try
    DataStringStream.CopyFrom(AData, AData.Size);
    UDPMemo.Lines.Add('Received "' + DataStringStream.DataString + '" from ' + ABinding.PeerIP + ' on port ' + IntToStr(ABinding.PeerPort));
    s := 'Replied from ' + UDPServer.LocalName + ' to "' + DataStringStream.DataString + '"';
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
  finally
    DataStringStream.Free;
  end;
end;


 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
93.87.4.*

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Indy UDP klijent-server i broadcast02.11.2009. u 09:23 - pre 176 meseci
Citat:

Ne vidim smisao u tome da server razgovara sa samim sobom.

Ne radi se o smislu (verovatno ga i nema), nego metoda za slanje streama SendTo (koja je unutar Server OnRead), prosledjuje stream po IP i Portu, a ti podaci su bas oni koje ima taj server, pa ga on i prima, jer ima implementiran OnRead, koji se igrom slucaja slaze po velicini i tipu onoga sto se prima.

Drugim recima, ABinding ima: IP, PeerIP, Port i PeerPort. E sad, treba videti gde i sta treba da se podesi da bi se gadjao klijent koji je poslao stream. Najbolje stavi neki Memo i ispisi vrednosti svih ovih parametara na prijemu. Po meni treba ona varijanta sa Peer.

Citat:

A po ovom primjeru iz Delphija ABinding ima informaciju o pošiljatelju.

Naravno da ima te informacije, ali to nisu IP i Port, pretpostavljam da treba PeerIP i PeerPort, bas kao sto je u primeru.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Indy UDP klijent-server i broadcast02.11.2009. u 09:28 - pre 176 meseci
Da. U tome je stvar. Nisam ni primjetio da sam umjesto PeerIP koristio IP. Port je isti na obje strane. Znači, rješenje je:

ABinding->SendTo(ABinding->PeerIP, ABinding->PeerPort, &n, sizeof(int));

Zahvaljujem.

EDIT:
Inače, ima tko kakav primjer za slanje broadcasta?
 
Odgovor na temu

[es] :: C/C++ programiranje :: Indy UDP klijent-server i broadcast

[ Pregleda: 2300 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.