UDP Packete senden
-
Hallo,
ich versuche UDP Packete auf einem Port zu senden doch leider passiert dieses nicht.
Ich nutze Windows XP Profesional und als C++ Kompiler MinGW Studio.
Er gibt mir keine Fehler aus und wenn ich das Programm zeigt er mir an das er mit dem SentTo probleme hat.Wer kann mit weiterhelfen oder hat so etwas schon mla umgesetzt
#include <stdio.h> #include <iostream> #include <winsock2.h> #include <sys/types.h> #include <sys/socket.h> #include <wininet.h> #include <sys/types.h> #include <unistd.h> #include <string.h> #define SRV_IP "192.168.180.44" #define BUFLEN 512 #define NPACK 2 #define PORT 9930 using namespace std; // inet_aton windows int inet_aton(const char *address, struct in_addr *sock) { int s; s = inet_addr(address); if (s == 1 && (address, "255.255.255.255")) return 0; sock->s_addr = s; return 1; } int main (int argc, char* argv[]) { struct sockaddr_in si_addr, si_other; int s, i, slen=sizeof(si_other); char buf[512]; printf("UDP Client\n"); WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa)) { printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError()); return EXIT_FAILURE; } s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) { perror("socket() failed"); return 1; } si_addr.sin_port = htons(PORT); si_addr.sin_family = AF_INET; if (inet_aton(SRV_IP, &si_other.sin_addr)==0) { perror("inet_aton() failed\n"); return 2; } for (i=0; i<NPACK; i++) { printf("Sending packet %d\n", i); sprintf(buf, "This is packet from Client2 with p-number %d\n", i); if (sendto(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, slen)==-1) perror("sendto() faild"); } return 0; }Danke Ralf
-
Hi Ralf
Deine Adresse ist eine Broadcast Adresse.
Wen du Broadcast senden willst musst du die Option mitint Len = sizeof(BOOL); int Val; // Set Broadcast opt setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char*)&Val, Len); /* Send x bytes */ by = sendto(socket ,&msg[0] ,(int)buflen ,0 ,(struct sockaddr *)&adr_data ,sizeof(adr_data));setzen !
Ansonnsten kann ich dir auch nicht weiter helfen.. abe mir dein Quellcode nicht gerade akribisch unter die Augen gerissen.lowbyte
-
Wo ist eine Broadcastadresse? Ich sehe nur hier eine, und die wird doch nicht zum senden verwendet:
if (s == 1 && (address, "255.255.255.255"))Außerdem, ist der Ausdruck "(address, "255.255.255.255")" nicht unsinnig?
-
Hi
Sorry habe ich übersehen.
Aber Probier mal den socket call ohne die angabe des IPPROTO_UDP.Setz in einffach auf 0.
if( (sock = socket(AF_INET ,SOCK_DGRAM ,0)) == INVALID_SOCKET ) { printf("Socket error %i", WSAGetLastError()); WSACleanup(); getchar(); return 0; } else { //printf("Winsock ok ...\n"); }lowbyte
-
Hi
Komisch komisch..
Diese Funktion ist doch eine Api funktion !Warum definiertst du hier deine eigene Version ? Hast du keine Fehler wen du compilierst ? Setz mal Den Errorlevel des Compilers herunter.
???? int inet_aton(const char *address, struct in_addr *sock) { int s; s = inet_addr(address); if (s == 1 && (address, "255.255.255.255")) return 0; sock->s_addr = s; return 1; }Und das zweite ist. Dein Messagebuffer ist nicht mit Daten gefüllt !??
lowbyte
-
Hi
Und ausserdem ist die anweisung : if(s == 1 && (address,"255.255.255.255")) ,völlig falsch. Das dir dein Compiler nicht eine Warnung ausgibt, ist schleierhaft. Wen du kein Ged ausgeben möchtes, verwende lieber die Express edt. Von vs2008 c&cpp.etc.
Somit ist der socket, bzw. Ip header mit undefinierten werten versehen. Darum wird auch sendto() scheitern.
Und schauen das dein Messagebuffer mit logischen werten versehen ist. Da bei nichtinitialisierung der variable, ein undefinierten wert vorhanden ist. Sofern sie nicht statisch oder global ist.Lowbyte
-
Hi
Und ausserdem ist die anweisung : if(s == 1 && (address,"255.255.255.255")) ,völlig falsch. Das dir dein Compiler nicht eine Warnung ausgibt, ist schleierhaft. Wen du kein Ged ausgeben möchtes, verwende lieber die Express edt. Von vs2008 c&cpp.etc.
Somit ist der socket, bzw. Ip header mit undefinierten werten versehen. Darum wird auch sendto() scheitern.
Und schauen das dein Messagebuffer mit logischen werten versehen ist. Da bei nichtinitialisierung der variable, ein undefinierten wert vorhanden ist. Sofern sie nicht statisch oder global ist.Lowbyte
-
Hallo und Danke für die vielen Antworten.
Die Funktion inet_aton gibt es für WIndows Nicht sindern nur für Linux. Geprüft wird in dieser Funktion ob die Adressübersetzung stattgefunden hat und ob es keine Broadcast Adresse ist.
Das eigentliche Problem kag daran das man die si.addr benutzen mußte und nicht die si_other.
hier noch mal der Lauffähige Code.
#include <stdio.h> #include <iostream> #include <winsock2.h> #include <sys/types.h> #include <sys/socket.h> #include <wininet.h> #include <sys/types.h> #include <unistd.h> #include <string.h> #define SRV_IP "192.168.180.44" #define BUFLEN 512 #define NPACK 2 #define PORT 9930 /* Einbindung libwsock32.a Unter Project/Settings/Link Unter Liberies die entsprechnde Liberie eintragen in unserem Fall libwsock32.a Die Datei muß sich in dem entsprechndem Projektverzeichnis befinden ! */ using namespace std; // inet_aton fpr windows int inet_aton(const char *address, struct in_addr *sock) { int s; s = inet_addr(address); if (s == 1 && (address, "255.255.255.255")) return 0; sock->s_addr = s; return 1; } int main (int argc, char* argv[]) { struct sockaddr_in si_addr, si_other; int s, i; int slen=sizeof(si_addr); char buf[512]; char wort[30]; char c; int x; printf("UDP Client\n"); printf("IP Adresse eingeben: "); scanf("%s", &wort); printf("Port eingeben: "); scanf("%d", &x); printf("- sende an IP: %s\n", wort); printf("- sende auf Port: %i\n", x); WSADATA wsa; if (WSAStartup(MAKEWORD(1, 1), &wsa)) { printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError()); return EXIT_FAILURE; } s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s == -1) { perror("socket() failed"); return 1; } //cout << "port=" << htons((int)PORT) << "\n"; //cout << "wort=" << htons((unsigned int)x) << "\n"; si_addr.sin_port = htons((unsigned int)x); si_addr.sin_family = AF_INET; if (inet_aton(wort, &si_addr.sin_addr)==0) { //if (inet_aton(SRV_IP, &si_addr.sin_addr)==0) { perror("inet_aton() failed\n"); return 2; } for (i=0; i<NPACK; i++) { printf("Nachricht eingeben:"); scanf("%s", &buf); //printf("Sending packet %d\n", i); //sprintf(buf, "This is packet from Client2 with p-number %d\n", i); if (sendto(s, buf, BUFLEN, 0, (struct sockaddr *) &si_addr, slen)==-1) perror("sendto() faild"); } return 0; }Danke für die Unterstützung
RalfPS. ich werde jetzt versuchen das ganze noch für TCP und Multicast umzusetzen
-
Ist trotzdem falsch.
Statt
if (s == 1 && (address, "255.255.255.255")) return 0;gehört es so:
if(s == INADDR_NONE || address == "255.255.255.255") return 0;
-
JohnnyCheckson schrieb:
Ist trotzdem falsch.
Statt
if (s == 1 && (address, "255.255.255.255")) return 0;gehört es so:
if(s == INADDR_NONE || address == "255.255.255.255") return 0;Nach dem
addressin seinem Beispiel einchar const*ist (und keinstd::string), ist das auch falsch.
Der Test auf 255.255.255.255 ist IMO auch total unnötig.
-
Hi
Das ist keine Funktion :(address, "255.255.255.255") also dieser Ausdruck liefert dir kein Ruckgabewert ! Wie hustbaer gesagt hat. Völlig unnötig. So wird es dir immer 0 liefern !!
lowbyte