tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
3012
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    inti 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 ...
     

  2. #2
    Radhad Radhad ist offline Mitglied Diamant
    Registriert seit
    Mar 2003
    Ort
    Wuppertal (NRW)
    Beiträge
    1.917
    Blog-Einträge
    35
    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

  1. Broadcast - Suche
    Von MHayer im Forum Java
    Antworten: 1
    Letzter Beitrag: 15.08.09, 01:03
  2. Broadcast per UDP
    Von Reverent im Forum .NET Web und Kommunikation
    Antworten: 9
    Letzter Beitrag: 31.12.05, 15:11
  3. Broadcast
    Von Nikon the Third im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 05.10.04, 08:46
  4. broadcast
    Von Luda im Forum Netzwerke
    Antworten: 6
    Letzter Beitrag: 28.10.03, 20:58
  5. broadcast
    Von galdasc im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 15.08.02, 13:05