ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
3012
3012
EMPFEHLEN
-
25.06.04 13:39 #1inti Tutorials.de Gastzugang
Hallöle ihr Freaks, ich habe ein kleines (großes) Problemchen :
Es geht darum, mit einer einfachen Konsolenanwendung einen UDP Broadcast zu senden, die einkommenden Informationen aufzuarbeiten und diese dann aufzulisten.
Das Ganze soll dazu dienen, das lokale Netz nach einem best. Kameratyp (Industriegerät) abzusuchen und deren ID sowie aktuelle IP auszulesen, um diese später spezifisch konfigurieren zu können (per TCP Verbindung).
Ich selber habe dafür ein einfaches Prog. als Vorlage bekommen, was ich zunächst versuchen sollte zu verstehen und dann zu zerpflücken, um einzelne Bausteine zu verwenden.
Prob ist, ich habe bis letzte Woche, als ich damit angefangen habe noch nie was mit C++ (MSoft Visual C++ 6) zu tun gehabt und auch sonst nur wenig Programmierskills, so dass ich mir immer noch nicht alle Codeteile restlos erklären kann .. aber trotzdem macht das Tool schon fast das was es soll..
Mein eigentliches Problem ist jetz, dass das Prog zwar , aber relativ unzuverlässig ist, bei 2 Kameras bekomme ich z.B. auch abundzu mal nur Antwort (oder gar keine), auch wenn ich nur 1 Kamera im Netz habe erhalte ich gelegentlich mal keine Antwort..
Die Erfolgsrate liegt so bei ca 60-70%
Wie kann ich, auf möglichst einfachem Weg eine Fehlerkorrektur einbauen ?
Wenn ich weitere Abfrageschleifen ins Prog einbaue, erhalte ich immer nur beim ersten Versuch eine Antwort, ich vermute also ich muss dafür irgendwas zurücksetzen..
und so siehts atm aus :
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
// konsolentest.cpp // #include "stdafx.h" int main(int argc, char* argv[]) { char buf[29]; char buffo[30]; char ip[40]; char ausgabe[400]; int timeout; SOCKET UDP_BC_Socket; // SOCKET TCP_CTL_Socket; struct sockaddr_in UDP_BC; UDP_BC.sin_family=AF_INET; UDP_BC.sin_port=htons(2222); UDP_BC.sin_addr.s_addr=htonl(INADDR_BROADCAST); memset(&(UDP_BC.sin_zero), '/0', 8); struct sockaddr_in client; client.sin_family=AF_INET; client.sin_port=htons(5432); // client.sin_addr.s_addr= inet_addr("192.168.2.1"); //eigene ip memset(&(client.sin_zero), '/0', 8); clock_t zeit,ziel; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); unsigned long pdaten; int addr_len, numbytes, bytes, nonblock =1, on=1; addr_len=sizeof sockaddr; bool fBroadcast = TRUE; char steuersend[130]; sprintf(buf,"on"); if (argc>1) timeout=atoi(argv[1]); if (timeout==0 || timeout<100 || timeout>10000) { printf("Keiner oder ung\x81ltiger Timeoutparameter angegeben !\nBitte Timeout in Millisekunden angeben (min 100, max 10000) : "); scanf("%d",&timeout); if (timeout<100 || timeout>10000) {printf("\nFehlerhafte Eingabe, Standart (1 sec) wird verwendet\n");timeout=1000;}; }; if( (UDP_BC_Socket = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) // --> Netzwerk bzw. Winsock Fehlerabfragen { int error = WSAGetLastError (); printf("Fehler bei Erstellung des Sockets\tFehlernummer : %d\n",error); } if (setsockopt(UDP_BC_Socket, SOL_SOCKET, SO_BROADCAST, (CHAR *) &fBroadcast, sizeof ( BOOL )) != 0) printf("\nFehler bei BROADCAST SERVER\n"); if (ioctlsocket(UDP_BC_Socket, FIONBIO, (u_long FAR *) &nonblock) == -1) { printf("Fehler bei NONBLOCKING SERVER\n");}; printf("\nScan l\x84uft\n\n"); numbytes= sendto(UDP_BC_Socket,"bLa",4,0,(struct sockaddr*) &UDP_BC, sizeof (struct sockaddr)); // --> UDP Rundruf buf[0]= '\0'; zeit=(clock_t)timeout * CLOCKS_PER_SEC/1000; ziel=zeit+clock(); while (ziel > clock()); bytes= recvfrom(UDP_BC_Socket,buf,8,0,(struct sockaddr*) &UDP_BC, &addr_len); // ioctlsocket(UDP_BC_Socket, FIONREAD, &pdaten); // --> Überprüfung, ob gepufferte Daten (bei mehrerern Kameras) vorhanden sind // printf("Gepufferte Bytes : %d\n",pdaten); if (bytes!=-1) { while (bytes!=-1) { buf[8]='\0'; // --> Formatierung Kamera ID sprintf(ausgabe,"Kamera-ID: %s @ %d.%d.%d.%d\n",buf, // --> Ausgabe ID und IP (unsigned char)(UDP_BC.sin_addr.s_addr), (unsigned char)(UDP_BC.sin_addr.s_addr >> 8), (unsigned char)(UDP_BC.sin_addr.s_addr >> 16), (unsigned char)(UDP_BC.sin_addr.s_addr >> 24)); ip[20]='\0'; printf(ausgabe,"\n"); bytes= recvfrom(UDP_BC_Socket,buf,8,0,(struct sockaddr*) &UDP_BC, &addr_len); // --> Abfrage weiterer Daten } } else { printf("Keine Kamera gefunden oder Verbindungsproblem\n"); printf("Hinweis : Vor Ausf\x81hrung Kamera(s) einschalten und Netzwerkverbindung herstellen \n\nDer Initialisierungsvorgang der Kameras dauert ca 30 Sekunden\n\n"); } printf("\nTransfer beendet !\n"); /* steuersend[0]=0x52; steuersend[1]=0x45; steuersend[2]=0x53; steuersend[3]=0x45; steuersend[4]=0x54; send(TCP_CTL_Socket,(char*) steuersend,5,0); */ closesocket(UDP_BC_Socket); // closesocket(TCP_CTL_Socket); printf("Tastendruck beendet die Verbindung !\n"); getch(); return 0; }
stdafx.h siehts so aus :
Code :1 2 3 4 5 6 7 8 9 10 11 12
#if !defined(AFX_STDAFX_H__025B847A_1C81_48CA_953F_E73FBC76A764__INCLUDED_) #define AFX_STDAFX_H__025B847A_1C81_48CA_953F_E73FBC76A764__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Selten benutzte Teile der Windows-Header nicht einbinden #include <stdio.h> #include <afxsock.h> #include <conio.h>
Bin für jegliche Hinweise und Hilfe dankbar ...
-
29.06.04 11:26 #2
Ich schätze mal, da musst du in die RFC vom UDP Protokoll nachschauen. Such bei Google mal nach ner Liste der ganzen RFC's.
Ähnliche Themen
-
Broadcast - Suche
Von MHayer im Forum JavaAntworten: 1Letzter Beitrag: 15.08.09, 01:03 -
Broadcast per UDP
Von Reverent im Forum .NET Web und KommunikationAntworten: 9Letzter Beitrag: 31.12.05, 15:11 -
Broadcast
Von Nikon the Third im Forum .NET ArchivAntworten: 1Letzter Beitrag: 05.10.04, 08:46 -
broadcast
Von Luda im Forum NetzwerkeAntworten: 6Letzter Beitrag: 28.10.03, 20:58 -
broadcast
Von galdasc im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 15.08.02, 13:05





Zitieren
Login






