Sockets



  • Also, ich habe ein bisschen mit Sockets rumgespielt. Die Telnet-Verbindung funktioniert auch so weit, aber ich muss jede Eingabe zweimal machen, da wohl anfangs irgendwelche Zeichen mit drinstecken die den Befehl, den ich senden will verunstalten.

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h> 
    
    void error(char *msg)
    {
        perror(msg);
        exit(0);
    }
    
    int main(int argc, char *argv[])
    {
        int sockfd, portno, n;
        struct sockaddr_in serv_addr;
        struct hostent *server;
    
        char buffer[1024];
        if (argc < 3) {
           fprintf(stderr,"%s hostname port\n", argv[0]);
           exit(0);
        }
        portno = atoi(argv[2]);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) 
            error("Fehler beim Oeffnen des Sockets");
        server = gethostbyname(argv[1]);
        if (server == NULL) {
            fprintf(stderr,"ERROR, no such host\n");
            exit(0);
        }
        bzero((char *) &serv_addr, sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        bcopy((char *)server->h_addr, 
             (char *)&serv_addr.sin_addr.s_addr,
             server->h_length);
        serv_addr.sin_port = htons(portno);
    
        if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
            error("Fehler");
      while (1 == 1)
       {
        printf(": ");
        bzero(buffer,1024);
        fgets(buffer,1023,stdin);
        n = write(sockfd,buffer,strlen(buffer));
        if (n < 0) 
             error("Fehler beim Schreiben");
        bzero(buffer,1024);
        n = read(sockfd,buffer,1023);
        if (n < 0) 
             error("Fehler beim Lesen");
        printf("%s\n",buffer);
        }
        return 0;
    }
    

    EDIT: In buffer[] steht aber immer das richtige drin



  • Hi,

    vielleicht solltest du die Warnung nicht ignorieren, die auch bei dir beim Kompilieren wahrscheinlich auftreten werden.



  • Hmm ja, ich bekomme

    s2.c:33: Warnung: unverträgliche implizite Deklaration der eingebauten Funktion »bzero«
    s2.c:35: Warnung: unverträgliche implizite Deklaration der eingebauten Funktion »bcopy«
    s2.c:40: Warnung: Übergabe des Arguments 2 von »connect« von inkompatiblem Zeigertyp
    s2.c:53: Warnung: unverträgliche implizite Deklaration der eingebauten Funktion »strlen«

    Ich weiss aber nicht wie ich damit umgehen soll, oder wie ich die Warnungen behebe



  • unverträgliche implizite Deklaration

    ... von bzero() und bcopy() sollte weg sein mittels #include <strings.h>
    ... von strlen() sollte weg sein mittels #include <string.h>

    jedenfalls lt. manual pages

    Übergabe des Arguments 2 von »connect«

    Bei "connect(...)" wird als 2. Parameter ein Typ "sockaddr" verlangt.

    auch hier siehe manual pages

    Gute Idee ist bei so etwas immer ein Blick in die man pages 😉



  • Alles entfernt und trotzdem keine Besserung 😞



  • ... nach kurzem tieferen Blick in den Code: da ist noch ein grundsätzliches Problem drin.

    Was du wohl vermutlich im Endausbau machen willst, ist eine Kommunikation zwischen 2 Prozessen, das läuft wesentlich komplizierter ab:

    So mal als Grundidee:

    Der erste Prozess macht socket(), bind(), listen() und accept() auf einem speziellen Port.

    Der zweite Prozess macht dann socket(), gethostbyname() und connect().

    Erst danach kann ein Schicken und Empfangen von Daten erfolgen. I.d.R ist der connect-Prozess der aktive Partner, der mit dem Datentransfer beginnt.

    Das kann man zum Probieren natürlich auch in einem Prozess machen, macht aber nicht wirklich Sinn.
    Wie gesagt, i.d.R. wird eine Socket-Verbindung zur bi-direktionalen Interprozess-Kommunikation genutzt. Wo es hierfür ein (einfaches) Beispiel gibt, kann ich so ad-hoc auch nicht sagen. Musst Du vielleicht mal kurz google'n....



  • Naja accept() und bind() brauch ich doch nur wenn ich einen Server programmieren will, oder? Gegooglet hab ich schon und bin eben zu dieser Lösung wie sie oben steht gekommen, das andere was man an Ergebnissen kriegt ist nicht wirklich brauchbar. 3/4 gehen fuer C# weg, Ein Teil des Rests ist unvollständig - da bleibt nicht viel übrig




Anmelden zum Antworten