Forum: PC-Programmierung UDP Client IP ändern


von Udo J. (udo_j)


Lesenswert?

Hallo zusammen,
ich habe folgendes Problem:
Wenn der UDP-Server noch keine Anfrage von einem Client bekommen hat, 
möchte ich eine bestimmte Client-IP (z.B. 192.169.40.160:4711) 
ansprechen!
Wie gebe ich die Client IP bei
der sendto(...) Anweisung ein?

Wenn der UDP-Server eine Anfrage bekommen hat kann ich eine Antwort 
senden.

Aber ich habe noch nicht genau verstanden wie ich an die IP und 
Port-Werte komme und sie verändern kann :-(

Geht dieses mit diesem UDP-Tool oder verfolge ich da den falschen 
Ansatz?

Vielleicht kann mir da ja jemand weiterhelfen, vielen Dank im voraus

/*_____________UDP_Server______________________*/
int udpSocket, nBytes;
char buffer[1024];
struct sockaddr_in serverAddr, clientAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size, client_addr_size;
char UDP_aktiv = 0;
char *IP;

/*_____Create UDP socket___________________*/
  udpSocket = socket(PF_INET, SOCK_DGRAM, 0);
  udpSocket2 = socket(PF_INET, SOCK_DGRAM, 0);
  /*Configure settings in address struct*/
  serverAddr.sin_family = AF_INET;   //UDP
  serverAddr.sin_port = htons(9034); //PORT:9034
  serverAddr.sin_addr.s_addr = inet_addr("192.168.40.4");//Server IP
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);

  clientAddr.sin_family = AF_INET; //UDP
  clientAddr.sin_port = htons(4711);  // this is where client is bound
  clientAddr.sin_addr.s_addr = inet_addr("192.168.40.160");
  memset(clientAddr.sin_zero, '\0', sizeof clientAddr.sin_zero);
/*-----------------------------------------*/

/*Bind socket with address struct*/
  bind(udpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));
  /*Initialize size variable to be used later on*/
  addr_size = sizeof serverStorage;
/*-------UDP-Server INI---End------------*/

void UDP_Server(){
     while(1){

nBytes = recvfrom(udpSocket,buffer,1024,0,(struct sockaddr 
*)&serverStorage, &addr_size);/*Schleife bis ein Zeichen kommt!*/

    std::cout <<buffer <<" <-UDP-Zeichen: "<<nBytes <<std::endl;

sendto(udpSocket,"#OK",3,0,(struct sockaddr *)&serverStorage, 
addr_size);/*<<<<-----Client IP ändern??

    std::cout << IP <<":"//Client IP und Port Info
              << ntohs(clientAddr.sin_port) <<std::endl;

UDP_aktiv =1;/*es ist etwas im buffer*/

    }
  }

von PittyJ (Gast)


Lesenswert?

Ich verwende bei unbekannten Adressen einen Broadcast. Dann kann man 
darauf reagieren. DHCP macht das ähnlich.

von Gerald K. (geku)


Angehängte Dateien:

Lesenswert?

Vielleicht hilft die Beschreibung im Anhang weiter.

von Udo J. (udo_j)


Lesenswert?

..Danke für die schnellen Antworten :-)
ich habe es so mal getestet:
clientAddr.sin_addr.s_addr = inet_addr("192.168.40.170");

sendto(udpSocket,"#OK",3,0,(struct sockaddr *)&clientAddr, 
sizeof(clientAddr));

da reagiert der Client leider nicht :-(
PS. das C++ Projekt läuft auf einem RasPi

von Udo J. (udo_j)


Lesenswert?

..Hey noch mal vielen Dank für die INFOs
es geht jetzt :-) :-) :-)
G.Udo

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.