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

Beitrag lesen

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?