client socket klasse
-
Hallo
Ich wollte wieder mit c++ anfangen und gleich mal sockets programmieren.
Dazu will ich mir eine klasse schreiben wie ich sie von delphi oder anderen programmiersprachen kenne.
Der clientsocket soll senden und empfangen können und das gleichzeitig.
Ich hab mir also zum testen einmal einen non blocking socket geschrieben der in einem thread auf recv geht.Ich will aber ordentlich damit umgehen können - deshalb die frage "kann man das so machen".
Oder ist das kompletter unsinn. ( funktionieren tuts - aber naja ..... )./* client.c */ #define BUF 1024 typedef boost::mutex::scoped_lock lock_type; boost::mutex io_mutex; void rsvthread ( int create_socket ){ char * buffer = (char*) malloc (BUF); int size; long save_fd; do { save_fd = fcntl( create_socket, F_GETFL ); save_fd |= O_NONBLOCK; fcntl( create_socket, F_SETFL, save_fd ); lock_type lk( io_mutex ); size = recv(create_socket, buffer, BUF-1, 0); if( size > 0){ buffer[size] = '\0'; printf ("Nachricht erhalten: %s\n", buffer); } lk.unlock(); sleep(1); } while (strcmp (buffer, "quit\n") != 0); } int main (int argc, char *argv[]) { int create_socket; char * buffer = (char*) malloc (BUF); struct sockaddr_in address; int size; if( argc < 2 ){ printf("Usage: %s ServerAdresse\n", *argv); exit(EXIT_FAILURE); } if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) > 0) printf ("Socket wurde angelegt\n"); address.sin_family = AF_INET; address.sin_port = htons (15000); inet_aton (argv[1], &address.sin_addr); if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0){ printf ("Verbindung mit dem Server (%s) hergestellt\n", inet_ntoa (address.sin_addr)); boost::thread thrd( boost::bind( &rsvthread, create_socket ) ); do { printf ("Nachricht zum Versenden: "); fgets (buffer, BUF, stdin); lock_type lk( io_mutex ); send(create_socket, buffer, strlen (buffer), 0); lk.unlock(); } while (strcmp (buffer, "quit\n") != 0); thrd.join(); } else { std::cout << "keine verbindung" << std::endl; } close (create_socket); return EXIT_SUCCESS; }Ich fühl mich in einer Sprache erst wohl, wenn ich weiß, dass ich vernünftigen code produziere, deshalb hoffe ich das schaut sich jemand an ......... ich weiß solche fragen sind langweilig, aber ich will c/c++ ordentlich lernen.
lg
Verucca
-
Wenn Du schon Boost verwendest, warum dann nicht auch Boost::asio?
-
Öhm, ich habe mir den Code jetzt nicht groß angeschaut, aber ich denke du solltest mal deine Einrückung verbessern.
Und wenn du schon boost benutzt, kannst du auch gleich boost.asio für sockets nutzen

-
bei SOCK_STREAM bekommst du keine Pakete sondern einen Byte-Stream den du selbst in Pakete zerlegen musst.
-
@aridamn
werd ich mir mal anschauen was die wirklich können, aber für boost finde ich immer recht wenig doku die einfach erklärt wird@The-Kenny
naja sobald ich einen ordentlichen editor für meine versuche verwende werd ich wohl auch das verbessern
@zu
versteh ich nicht.
hab ich geschreiben, dass ich packete haben will?
das ich mir bei tcp ein eigenes protokoll machen muss ist mir klar - wie gesagt hab ich schon in anderen sprachen einiges mit sockets gemacht.
eigentlich will ich letzten endes genau streams haben.
ich will mir einen streaming client bauen der einen stream von mythbackend ( mythtv projekt ) an einen player weiterleitet.
Eigentlich sollte der stream sogar über eine callback funktion geliefert werden.
wenn was da ist, dann wird verarbeitet - also event basierend.
aber ich steh ja noch am anfang - erstmal c/c++ ordentlich verstehen.lg
-
Ne hast du nicht gesagt, aber du hast es so programmiert. Ich meine du rufst recv auf und prüfst dann ob "QUIT\n" im Puffer steht. Aber was ist wenn du bei jedem recv Aufruf z.B. nur 1 Byte bekommst?
-
da hast du vollkommen recht.
das quit steht eigentlicht nur drin, weil ich das mit einem selbstgeschriebenen server teste und ich fix eine abbruch bedingung gebraucht hab.
aber richtig - das ist unsinn - war aber auch nicht der sinn der sache - der abbruch wird eher im thread erfolgen und nicht über den socket.lg