Netzwerkprogrammierung



  • Hallo

    ich hätte gerne dass ich ein C-Programm vom Server starten kann. Kennt ihr vielleicht gute Tutorials.

    Habe das Zotteljedi gefunden aber der Code ist nicht wirklich kommentiert und ich weiß nicht wie ich das ganze starte und wie ich das programmieren muss usw.

    Kennt ihr vielleicht noch andere gute deutsche Tutorials.

    MfG



  • socke schrieb:

    ich hätte gerne dass ich ein C-Programm vom Server starten kann. Kennt ihr vielleicht gute Tutorials.

    was genau meinst du damit=



  • Ich habe zb. ein C-Programm wo ich nach Name, Alter, Adresse usw. gefragt.

    Das möchte ich Netzwerkfähig machen.

    Dazu brauche ich den Serverprozess dass ich dieses Programm vom telnet aufrufen kann.

    Wenn das Programm gestartet ist soll es schreiben Name eingeben.
    Dann gebe ich den Namen ein. Wenn der Name richtig eingeben wurde dann soll es nach dem Alter fragen usw.



  • http://www.c-worker.ch/tuts/wstut_op.php

    Du musst da dann glaub ich nur die richtigen header Datein einbinden weil das wäre jetzt für Windows ...

    Hier noch was zu Linux: http://cplus.kompf.de/artikel/httpget.html



  • Hallo,

    könnte vielleicht jemand sich den Code anschauen. Ich habe nicht viel Ahnung was ich da gemacht habe, habe den Code zum Teil aus Skripten. Es kommen paar Fehler vor aber ich weiß nicht was die Fehler sind.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    #define PORTNUMMER 6543;
    
    int main()
    {
      int socketfd;
      struct sockaddr_in servaddr, client;
      int ret=0;
      socklen_t client_size;
      int new_socket;
      pid_t ForkPID ;
    
      socketfd = socket (PF_INET, SOCK_STREAM, 0);
      if (socketfd < 0)
      {
        perror ("Socket konnte nicht angelegt werden!");
        exit (EXIT_FAILURE);
      }
      else
      {
        printf ("Socket wurde angelegt!\n");
      }
    
      //setsock = setsockopt (socketfd, SOL_SOCKET, SO_REUSEADDR, );
    
      servaddr.sin_family = PF_INET;
      servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
      servaddr.sin_port = htons (PORTNUMMER);
    
      ret = bind (socketfd, (struct sockaddr_in *) &servaddr, sizeof (servaddr) );
      if (ret<0)
      {
        perror ("Port schon belegt!");
        exit (EXIT_FAILURE);
      }
      else
      {
        printf ("Port wurde angelegt!\n");
      }
    
      ret = listen (socketfd, 5);
      if (ret<0)
      {
        perror ("Server nicht bereit eine Verbindung einzugen!");
        exit (EXIT_FAILURE);
      }
    
      while (1)
      {
        client_size = sizeof (client);
    
        new_socket = accept (socketfd, (struct sockaddr_in *) &servaddr, &client_size);
        if (new_socket<0)
        {
          perror ("Client konnte nicht verbunden werden!");
          exit (EXIT_FAILURE);
        }
        else
        {
          printf ("Ein Client wurde verbunden!\n");
        }
    
        ForkPID=fork();
        if (ForkPID==0)
        {
          dup2 (new_socket, 0);
    
          dup2 (new_socket, 1);
    
          execlp ("./mastermind","mastermind", (char *) NULL);
        }
    
        else
        {
        	close(new_socket);
        }
      }
    
      return 0;
    }
    

    Was machen diese Funktionen

    void SIGCHLD_handler(int signo)
    {
     pid_t	pid ;
     int	stat ;
    
     while ( (pid=waitpid(-1,&stat,WNOHANG)) > 0 )
         ;
    
     return ;
    } 
    
    void install_SIGCHLD_handler(void)
    {
     struct sigaction	act ;
    
     sigfillset(&act.sa_mask) ; 
    
     act.sa_handler = &SIGCHLD_handler ;
     act.sa_flags = SA_RESTART ;
     sigaction (SIGCHLD,&act,NULL) ;
    }
    


  • Vielleicht eine etwas pragmatischere Lösung. Nimm dein normales Konsolen Programm und richte den inetd so ein, dass er dein Programm aufruft. Dann werden alle Netzwerk-Anfragen in die Standard-Eingabe deines Programms geschrieben und alle Ausgaben über das Netzwerk an den Client gesendet.



  • @progchild

    Mir ist bisschen unklar was du da meinst.

    Beim Ausführen des Programmes zeigt es mir drei Fehler an, ich komme aber nicht darauf was falsch ist. Mich würde interessieren ob und wo noch Fehler sind bzw. ob das Programm so ausführbar wäre.

    Wozu dient die setsockopt-Funktion



  • socke schrieb:

    @progchild

    Mir ist bisschen unklar was du da meinst.

    Siehe hier: http://en.wikipedia.org/wiki/Inetd

    Mit dem inetd kannst du das alles ohne dich mit Sockets auseinander setzen zu müssen umsetzen.



  • Beim Client, wie kann ich programmieren wenn a!=b!=c!=d!=d ist dass es die Variablen an den Server schickt und mit anderen Variablen vom Programm vergleicht?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    #define PORTNUMMER 6543
    
    int main()
    {
      int socketfd;
      struct sockaddr_in clientaddr;
      int a, b, c, d, e;
    
      a=b=c=d=e = 1;
    
      socketfd = socket (PF_INET, SOCK_STREAM, 0);
      if (socketfd < 0)
      {
        perror ("Socket konnte nicht angelegt werden!");
        exit (EXIT_FAILURE);
      }
      else
      {
        printf ("Socket wurde angelegt!\n");
      }
    
      clientaddr.sin_family = PF_INET;
      clientaddr.sin_port = htons (PORTNUMMER);
      clientaddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
    
      if (connect (socketfd, (struct sockaddr*) &clientaddr, sizeof (clientaddr) ) < 0)
      {
        perror ("Verbindung mit dem Server konnte nicht hergestellt werden!");
        exit (EXIT_FAILURE);
      }
      else
      {
        printf ("Verbindung mit dem Server %s wurde hergestellt!\n", inet_ntoa (clientaddr.sin_addr) );
      }
    
      do
      {
    
      	for(a=1; a<=8; a++)
      	{
      		for(b=1; b<=8; b++)
      		{
      			for(c=1; c<=8; c++)
      			{
      				for(d=1; d<=8; d++)
      				{
      					for(e=1; e<=8; e++)
      					{
      						if( (((a!=b)!=c)!=d)!=e )
      						{
    
      						}
      					}
      				}
      			}
      		}
      	}
    
      }while();
    
      close (socketfd);
    
      return 0;
    }
    


  • Hat niemand eine Lösung wie man Daten an den Server schickt und empfängt.



  • FÜr eine Client-Server Kommunikation musste du dir erstmal - in deinem Fall wohl eher ein simples - Protokoll überlegen wie sich der Client mit dem Server verständigt.
    Ein mögliches Problem ist nähmlich, dass die Pakete die du schickst nicht in einem Stück sondern aufgespaltet beim Server oder Client ankommen. Wenn du immer nur kleine Daten verschickst und das ganze auch nur über das Netzwerk kannst du das aber erstmal vernachlässigen. Das Senden von Daten geht dann einfach mit der Funktion send().

    blan



  • Was meinst du mit ein simples Protokoll. Ich kommuniziere über TCP/IP.

    Das Senden und Empfangen geht über send und recv oder write und read.

    Ich weiß jetzt nicht wie ich einrichten kann dass der Client 5 Int. Zahlen an den Server sendet.
    Das Server vergleicht die Zahlen und sendet wieder an den Client ein Ergebnis.
    Dann schaut sich der Client das Ergebnis an. Wenn sie nicht stimmen dann soll der Client an den Server wieder eine andere Zahlenkombination senden usw.

    Mir fällt nicht ein wie ich das programmieren könnte das es in diesem Ablauf passiert.



  • Dein Webbrowser arbeitet auch mit TCP/IP und benutzt dennnoch ein weiteres Protokoll - nähmlich HTTP, dass auf TCP/IP basiert.
    Du kannst zum Beispiel ein Struct mit 5 Integer-Elementen erzeugen und es dann verschicken. So etwa:

    struct Daten {
      unsigned int zahl1;
      unsigned int zahl2;
      unsigned int zahl3;
      unsigned int zahl4;
      unsigned int zahl5;
    };
    
    Daten daten;
    
    daten.zahl1 = 4;
    daten.zahl2 = 8;
    daten.zahl3 = 15;
    daten.zahl4 = 16;
    daten.zahl5 = 23;
    
    char *p = malloc(sizeof(Daten));
    
    memcpy(p, &daten, sizeof(Daten));
    send(socket, p, sizeof(Daten));
    
    free(p);
    

    so in etwa kannst du das machen - sind bestimmt paar Fehler drin, weil ich es einfach schnell ausm Kopf gecodet habe.

    blan



  • was soll der sinn vom malloc/memcpy da sein? kann man auch direkt an send übergeben



  • ja das ist wohl wahr - danke 😃

    send(socket, (const void *) &daten, sizeof(Daten), 0);
    

    so sollte es dann wohl aussehen.

    blan



  • Ich habe es geschafft den Server zu starten. Im Server stehen diese Zeilen.

    while(1) {
        len = sizeof(cliaddr);
    
        connfd=accept(listenfd, (struct sockaddr *) &cliaddr, &len);
        if (connfd == -1)
          exit(EXIT_FAILURE);
    
        ForkPID = fork() ;
        if (ForkPID == 0) { 
    
            close(listenfd) ; 
    
            dup2(connfd, 0); 
    
            dup2(connfd, 1); 
    
            execlp("./programm","programm",(char *)NULL); // execute a STDIN/STDOUT application             
    
        } else {
    
            close (connfd) ; 
        }
      } 
    }
    

    Wenn ich jetzt versuche programm zu kompilieren steht

    /usr/bin/ld: cannot open output file programm: Is a directory
    collect2: ld returned 1 exit status
    

    Was bedeutet das bzw. was kann der Fehler dahinter sein.



  • Habe es geschafft dass eine Verbindung besteht aber es führt das Programm nicht aus.

    if (ForkPID == 0) { 
    
            close(listenfd) ;
    
            dup2(connfd, 0);
    
            dup2(connfd, 1); 
    
            execlp("/media/datei/programm","programm",(char *)NULL);          
    
        }
    

    Mit dem wird das Programm aufgerufen. Wenn ich jetzt den Server starte und versuche das Programm aufzurufen mit telnet localhost 6666 erscheint dieser Text aber das Programm wird nicht ausgeführt. Was kann der Fehler sein.

    datei@datei:/media/datei$ telnet localhost 6666
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    

    MfG


Anmelden zum Antworten