I/O Blocking mit UDP



  • Hi !

    kann mir jemand sagen wie ich non-Blocking I/O mit udp verwirkliche?
    Gebe zu ,die Frage ist sehr abstrakt gestellt, aber ich habe wirklich keine Ahnung.

    Besonders hilfreich wäre es: wenn mir jemand sagen könnte wie ich folgenden Code mit non Blocking I/O umsetze

    int fd = socket( AF_INET, SOCK_DGRAM, 0 );
    .
    .

    addr.sin_family = AF_INET; // Protokoll Familie Ip Version 4 (32 Bit)
    addr.sin_port = htons( 0 ); // Random port
    addr.sin_addr.s_addr = htonl( INADDR_ANY ); // IP wird automatisch bestimmt

    int err = bind( fd, ( struct sockaddr* ) &addr, sizeof( struct sockaddr_in ) );

    .
    .
    .

    while ( strcmp( msg.text,"exit" ) !=0 )
    {
    //---------------------------------------------------------------------
    //---- ----
    //---- EMPFANGS_TEIL ----
    //---- ----
    //---------------------------------------------------------------------
    cout << "Empfangsbereit: " << endl;

    // empfangen eines UDP Datagrammes
    int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );

    // Host bekommen // Unsicher ob folgende Zeile Notwendig?
    phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );

    // Anzahl der Nachrichten und die Nachricht ansich ausgeben
    cout << msg.counter << "te" << "Empfangene Nachricht: ";
    cout << msg.text << endl;
    //---------------------------------------------------------------------
    //---- ----
    //---- SENDE_TEIL ----
    //---- ----
    //---------------------------------------------------------------------
    /*if(msg.counter ==0)
    cout << "Empfangsbereit: " << endl;

    // empfangen eines UDP Datagrammes
    int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );

    // Host bekommen // Unsicher ob folgende Zeile Notwendig?
    phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );

    // Anzahl der Nachrichten und die Nachricht ansich ausgeben
    cout << msg.counter << "te" << "Empfangene Nachricht: ";
    cout << msg.text << endl;
    }*/

    cout<<" Sende bereit: \n";

    // die nachricht wird von Tastatur eingelesen
    cin.getline( msg.text,64 );

    // senden eines UDP Datagrammes
    /*int*/ len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &from, sizeof( struct sockaddr_in ) );

    // Counter erhöhen
    msg.counter++;

    } // Ende While

    Dieses ist mein Code mit Blocking I O

    NUN KOMMT MEIN VERSUCH MIT NON BLOCKING I/O (den Teil den ich mir überlegt habe, hab ich mit ⚠ Markiert)

    p
    int fd = socket( AF_INET, SOCK_DGRAM, 0 );

    //------------------------------------------------------------------------------
    // BINDEN
    //------------------------------------------------------------------------------

    addr.sin_family = AF_INET; // Protokoll Familie Ip Version 4 (32 Bit)
    addr.sin_port = htons( 0 );
    addr.sin_addr.s_addr = htonl( INADDR_ANY ); //
    int flags;

    flags= fctnl(fd,F_GETEFL,0) //fcntl ist eine systemfunktion um den Socket in den non Blocking modus zu setzen

    int err = fcntl(sockfd, F_SETFL, flags |O_NONBLOCK); // ??anstelle von bind( fd, ( struct sockaddr* ) &addr, sizeof( struct sockaddr_in ) );

    // Auf Fehler überprüfen und bei Fehler Socket beenden
    if ( err < 0 )
    {// open if err
    cout << "Close: " << close( fd ) << endl;
    cerr << "Fehler beim Binden für UDP" << endl;
    } //close if err

    // Socketlänge vom Typ socklen_t von addr in namelen abspeichern
    socklen_t namelen = sizeof( addr );

    // eigener Port in tmpaddr
    int sock = getsockname( fd,(sockaddr*) &tmpaddr, &namelen );

    //Probeweise ausgabe ob sich etwas verändert hat
    // Eigenen Port mittels tmpaddr ausgeben
    cout << "Eigener Port: " << ntohs( tmpaddr.sin_port ) << endl;

    while ( strcmp( msg.text,"exit" ) !=0 )
    {
    //---------------------------------------------------------------------
    //---- ----
    //---- EMPFANGS_TEIL ----
    //---- ----
    //---------------------------------------------------------------------
    cout << "Empfangsbereit: " << endl;

    // empfangen eines UDP Datagrammes
    int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );

    // Host bekommen
    phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );

    // Anzahl der Nachrichten und die Nachricht ansich ausgeben
    cout << msg.counter << "te" << "Empfangene Nachricht: ";
    cout << msg.text << endl;
    //---------------------------------------------------------------------
    //---- ----
    //---- SENDE_TEIL ----
    //---- ----
    //---------------------------------------------------------------------

    cout<<" Sende bereit: \n";

    // die nachricht wird von Tastatur eingelesen
    cin.getline( msg.text,64 );

    ⚠ 💡 if ( len = recvfrom(STDIN_FILENO,&msg, sizeof(msg), 0, (struct sockaddr*) &dest,&namelen )< 0)
    {
    if(errno != EWOULDBLOCK)
    printf("ES IST EIN FEHLER AUFGETRETEN \n");
    else
    {
    len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &dest, sizeof( struct sockaddr_in ) );
    if (len < sizeof(msg))
    printf("FEHLER NACHRICHT KONNTE NICHT GESENDET WERDEN\n");
    } ⚠ 💡
    }
    // senden eines UDP Datagrammes
    /*int*/ len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &from, sizeof( struct sockaddr_in ) );

    // Counter erhöhen
    msg.counter++;

    } // Ende While

    Schon mal vielen Dank im Voraus(besonders für die die das bis hier hin gelenen haben 😉 )
    Gruß Michael



  • Bist neu hier, deswegen gleich mal ein paar Infos:

    1. Bitte Posting nochmal editieren und rund um deinen Cpp-Code

    und abschließend
    

    machen. Dann wird der schön formatiert, so liest das kein Schwein 😉

    2. Du bist im falschen Forum gelandet. Mit Webzeugs ist nicht das Benützen von Netzwerk-Libraries unter C++ gedacht sondern mehr HTML, PHP, etc.

    So sobald der Code formatiert ist kann man den dann auch angehen 🙂

    MfG SideWinder


Anmelden zum Antworten