Anzeige:
Ergebnis 1 bis 11 von 11

Thema: c++ netzwerkprogrammierung select

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.04.2006
    Beiträge
    69

    c++ netzwerkprogrammierung select

    Ich will die netzwerkprogrammierung so gestallten das der server nicht immer bei
    m accept stehenbleibt und wartet.

    Nun gibt es fcntl und slelect.
    Weis einer wo es dazu gute anleitung gibt und gut verständlcihe Bspiele...

  2. #2
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762
    Was für eine Bibliothek benutzt Du da eigentlich?
    I haven't lost my mind - It's somewhere on a backup-disc

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.04.2006
    Beiträge
    69
    ich benutz ddie normalen includes für unix

    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

  4. #4
    Registrierter Benutzer
    Registriert seit
    26.11.2004
    Ort
    Fulda
    Beiträge
    70
    Hi

    gibt es eigentlich noch spezille C++ libs für Netzwerk Programmierung ??

    mfg

    gsus
    C > Java oder wie ?

  5. #5

  6. #6
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Je nach Anwendung reicht es mit fcntl() den Socket mit O_NONBLOCK auszustatten, dann kommt der accept() sofort wieder -EAGAIN zurück, wenn nichts ansteht. Wenn du das in einen Loop verpackst, dann nennt man das pollen, was sicherlich nicht besonders effizient ist.

    Und hier kommt select() ins Spiel, dass dir erlaubt, ein oder mehrere Filedescriptoren auf anstehende Anfragen zu überprüfen und gegebenfalls auch noch einen Timeout anzugeben, nach dem select() auf jedenfall zurückkehrt.

    Gerade zum lernen ist es sicherlich nicht schlecht, einmal mit dem rohen socket-API umzugehen. Falls du damit ein bisschen Spielen willst, könntest du das socket-Modul in Python verwenden, das sich genau auf das C-API abbildet, aber wesentlich einfach in der interaktiven Konsole zum experimentieren eignet.

    Oft, gerade bei umfangreicheren Anwendungen, lohnt es sich durchaus, eine bestehende Bibliothek zu verwenden.

    Gruss, Andy

  7. #7
    Registrierter Benutzer
    Registriert seit
    11.04.2006
    Beiträge
    69
    @RapidMax genau das denk ich auch, erstmal mit der rohen API
    Geändert von barton4 (17-09-2006 um 20:53 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    11.04.2006
    Beiträge
    69
    hier ist einBSp... was mehrer telnet clients zulassen soll und wenn ein client etwas versendet soll es auf den anderen erscheinen, keider funktioniert das nicht, man kann sich zwar mit telnet verbinden aber versendet wird nichts

    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/socket.h>
    #include <sys/time.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <iostream>
    using namespace std;
    #define PORT 1222

    int main()
    {

    int s, s2;
    sockaddr_in my, remove;
    int smax;
    fd_set master;
    char buffer[]="Anfangstext";
    socklen_t size = 0;

    my.sin_family = AF_INET;
    my.sin_port = htons(PORT);
    my.sin_addr.s_addr= INADDR_ANY;
    memset(my.sin_zero, 0, 8);


    int yes=1;
    s = socket(AF_INET, SOCK_STREAM, 0);
    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
    bind(s, (sockaddr *)&my, sizeof(my));
    FD_ZERO(&master);
    FD_SET(s, &master);
    smax=s;
    if( listen(s, 20)==-1)
    {
    cout<<"error: listen"<<endl;
    }

    while(true)
    {
    cout<<"-"<<endl;
    if( select(smax+1, &master, NULL, NULL, NULL) == -1 )
    {
    cout<<"error: select"<<endl;
    exit(1);
    }
    for(int i=0; i<=smax; i++)
    {
    cout<<"i:"<<i;
    if(i!=s)
    {
    size=sizeof(sockaddr);
    s2=accept(s, (sockaddr *)&remove, &size);
    if(s2>0)
    {
    FD_SET(s2, &master);
    if(s2>smax){smax=s2;}
    }
    if (FD_ISSET(i, &master))
    {
    send(i, buffer, strlen(buffer), 0);
    }
    }
    }
    for(int i=0; i<=smax;i++)
    {
    if(s!=i || FD_ISSET(i, &master))
    {
    recv(i, buffer, strlen(buffer), 0);
    }
    }
    }


    }

  9. #9
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456

  10. #10
    Registrierter Benutzer
    Registriert seit
    11.04.2006
    Beiträge
    69
    http://beej.us/guide/bgnet/ probiert

    von dieser Seite hab ich den Code, hab in aber nicht abgeschrieben sondern versucht
    selber noch mal beu zu schreiben, zum verständnis halber...
    Geändert von barton4 (22-09-2006 um 07:51 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    02.07.2004
    Beiträge
    456
    Ist meiner Meinung nach für die Standard-Netzwerk-Entwicklung unter Linux das beste Tutorial im Netz.

    Die ist auch noch gut: http://www.zotteljedi.de/doc/socket-tipps/
    Geändert von 7.e.Q (22-09-2006 um 08:25 Uhr) Grund: Noch was in meinen Bookmarks gefunden...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •