Markus: ( C ) Client, der auch Daten empfangen soll?

Hallo,

Mit C habe ich einen Client gebastelt, der zu einem primitiven Server (der auch mit C geschrieben wurde) eine Verbindung herstellen soll.
Der Server scheint so weit richtig zu funktionieren, da ich mich mit telnet dorthin verbunden habe und den eigegebenen Text der Konsole am Server ausgeben lies.
Ich schaffte dies zwar auch mit dem gebastelten Client, aber das Dumme dabei ist, dass ich vom Server keine Nachrichten empfangen kann (zB die "Welcome"-Message).
Ich weiß zwar, dass ich read() verwenden muss, aber ich kann read() nicht einfach irgendwo im Quelltext oder in der Endlosschleife der Dateneingabe platzieren, da der Server doch zu _jeder_ Zeit etwas senden können muss (zB eine Pseudonachricht an alle Clienten), und nicht erst dann, wenn das Programm an der Stelle, wo der read()-Befehl ausgeführt werden kann, gelangt ist. Mein Problem hat also weniger mit Netzwerkkommunikation zu tun, sondern eher mit der Programmlogik. Kann mir jemand dazu ein paar nützliche Tipps geben?

Hier der Quellcode:

  
#include <stdio.h>  
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netdb.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <unistd.h>  
#include <string.h>  
  
#define BUFFER_SIZE 1024  
  
int main(int argc, char *argv[])     {  
 int sock;  
 struct sockaddr_in srv;  
 char stdinbuffer[256];  
  
 if (argc != 3)     {  
 fprintf(stderr, "usage: %s host port\n", argv[0]);  
 return 1;  
 }  
  
 if ( (sock = socket(AF_INET, SOCK_STREAM, 0) ) == -1 )  
 perror("socket failed()");  
  
 srv.sin_family = AF_INET;  
 srv.sin_addr.s_addr = inet_addr(argv[1]);  
 srv.sin_port = htons( (unsigned short int) atol(argv[2]) );  
  
 if (connect(sock, &srv, sizeof(srv)) == -1)  
 perror("connect failed()");  
 /*Daten aus stdin einlesen */  
 while (1)    {  
   printf("> ");  
 fgets(stdinbuffer, 255, stdin);  
     if (write(sock, stdinbuffer, strlen(stdinbuffer) ) == -1)  
     perror("Error writing to socket");  
             if (stdinbuffer[0] == '\n')  
             break;  
 }  
 close(sock);  
  
return 0;  
}  

Markus.

--
http://www.apostrophitis.at
STANDAR_D_  - ist das wirklich so schwer?
     
  1. echo $begrüßung;

    Du möchtest also mit einem Programm zwei Dinge quasi gleichzeitig erledigen. Zum einen ständig auf ankommenden Verkehr lauschen und unabhängig davon noch andere Dinge tun. Eine Lösungsmöglichkeit wäre der Einsatz von Threads. (Mehr als dieses Stichwort kann ich dir dafür leider nicht liefern.)

    echo "$verabschiedung $name";

    1. Hi,

      Threads sind mir zwar bekannt, aber ich glaube, dass es in diesem Fall doch ein Mit-Kanonen-Auf-Spatzen-Schießen ist. Vielleicht könnte man das ganze irgendwie mit while() verschachteln, aber das werde ich noch ausprobieren.

      Markus.

      --
      http://www.apostrophitis.at
      STANDAR_D_  - ist das wirklich so schwer?
           
  2. 你好 Markus,

    es gibt im wesentlichen drei Möglichkeiten:

    • Zwei Prozesse verwenden
    • Threads verwenden
    • Multiplexing I/O (also mit select(), nicht-blockierenden Sockets udgl. arbeiten)

    Zu allen drei Stichwörtern solltest du problemlos eine Menge finden. Ich
    empfehle auch das Buch "Programmieren von UNIX-Netzen", von Richard Stevens.

    再见,
     克里斯蒂安