Socket ?



  • Hallo,
    ich google nun seid Stunden durch das Weite Weite... Internet und finde irgendwie nichts was ich gebrauchen kann könnt ihr mir einen einfachen Code für einen Client der nur zu einen Server verbindet und die Empfangenden Nachrichten ausgibt... Ich schaffe es absolut nicht...

    Beispiel reicht mir schon aber bitte nich so kompliziertes habe vorher nur unter Windows programmiert...

    Gruß 😃



  • hmmm ... seit Stunden ? ... innerhalb einer minute findet man viele brauchbare sachen zu dem thema ... dieser hier ist recht gut http://www.ecst.csuchico.edu/~beej/guide/net/

    hf ... TDO



  • Danke aber so richtig klappen tut es nicht nehmen wir mal dieses Beispiel :

    /*
        ** client.c -- a stream socket client demo
        */
    
        #include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <errno.h>
        #include <string.h>
        #include <netdb.h>
        #include <sys/types.h>
        #include <netinet/in.h>
        #include <sys/socket.h>
    
        #define PORT 3490 // the port client will be connecting to 
    
        #define MAXDATASIZE 100 // max number of bytes we can get at once 
    
        int main(int argc, char *argv[])
        {
            int sockfd, numbytes;  
            char buf[MAXDATASIZE];
            struct hostent *he;
            struct sockaddr_in their_addr; // connector's address information 
    
            if (argc != 2) {
                fprintf(stderr,"usage: client hostname\n");
                exit(1);
            }
    
            if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info 
                perror("gethostbyname");
                exit(1);
            }
    
            if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
                perror("socket");
                exit(1);
            }
    
            their_addr.sin_family = AF_INET;    // host byte order 
            their_addr.sin_port = htons(PORT);  // short, network byte order 
            their_addr.sin_addr = *((struct in_addr *)he->h_addr);
            memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct 
    
            if (connect(sockfd, (struct sockaddr *)&their_addr,
                                                  sizeof(struct sockaddr)) == -1) {
                perror("connect");
                exit(1);
            }
    
            if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
                perror("recv");
                exit(1);
            }
    
            buf[numbytes] = '\0';
    
            printf("Received: %s",buf);
    
            close(sockfd);
    
            return 0;
        }
    

    Ich kompiliere es mit gcc main.c -o main . Und bekomme folgende Fehler :

    In file included from main.c:6:
    /usr/include/unistd.h:539: error: parse error before "confstr"
    /usr/include/unistd.h:539: error: parse error before "size_t"
    /usr/include/unistd.h:708: error: parse error before "size_t"
    /usr/include/unistd.h:733: error: parse error before "size_t"
    In file included from main.c:6:
    /usr/include/unistd.h:784: error: parse error before "size_t"
    /usr/include/unistd.h:791: error: parse error before "size_t"
    /usr/include/unistd.h:801: error: parse error before "size_t"
    /usr/include/unistd.h:802: error: parse error before "size_t"
    /usr/include/unistd.h:819: error: parse error before "size_t"
    In file included from main.c:8:
    /usr/include/string.h:39: error: parse error before "size_t"
    /usr/include/string.h:42: error: parse error before "size_t"
    /usr/include/string.h:51: error: parse error before "size_t"
    /usr/include/string.h:58: error: parse error before "size_t"
    /usr/include/string.h:61: error: parse error before "size_t"
    /usr/include/string.h:65: error: parse error before "size_t"
    /usr/include/string.h:86: error: parse error before "size_t"
    /usr/include/string.h:93: error: parse error before "size_t"
    /usr/include/string.h:99: error: parse error before "size_t"
    /usr/include/string.h:106: error: parse error before "strxfrm"
    /usr/include/string.h:107: error: parse error before "size_t"
    /usr/include/string.h:176: error: parse error before "strcspn"
    /usr/include/string.h:180: error: parse error before "strspn"
    /usr/include/string.h:230: error: parse error before "strlen"
    /usr/include/string.h:248: error: parse error before "size_t"
    /usr/include/string.h:253: error: parse error before "size_t"
    /usr/include/string.h:257: error: parse error before "size_t"
    /usr/include/string.h:260: error: parse error before "size_t"
    /usr/include/string.h:263: error: parse error before "size_t"
    /usr/include/string.h:291: error: parse error before "size_t"
    In file included from /usr/include/sys/uio.h:29,
    from /usr/include/sys/socket.h:27,
    from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/bits/uio.h:45: error: parse error before "size_t"
    In file included from /usr/include/sys/socket.h:35,
    from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/bits/socket.h:221: error: parse error before "size_t"
    /usr/include/bits/socket.h:224: error: parse error before "msg_controllen"
    /usr/include/bits/socket.h:227: error: parse error before '}' token
    /usr/include/bits/socket.h:232: error: parse error before "size_t"
    /usr/include/bits/socket.h:239: error: parse error before '}' token
    In file included from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/sys/socket.h:136: error: parse error before "size_t"
    /usr/include/sys/socket.h:143: error: parse error before "size_t"
    /usr/include/sys/socket.h:150: error: parse error before "size_t"
    /usr/include/sys/socket.h:161: error: parse error before "size_t"
    In file included from /usr/include/netdb.h:33,
    from main.c:9:
    /usr/include/rpc/netdb.h:61: error: parse error before "size_t"
    /usr/include/rpc/netdb.h:65: error: parse error before "size_t"
    /usr/include/rpc/netdb.h:69: error: parse error before "size_t"
    In file included from main.c:9:
    /usr/include/netdb.h:162: error: parse error before "size_t"
    /usr/include/netdb.h:169: error: parse error before "size_t"
    /usr/include/netdb.h:175: error: parse error before "size_t"
    /usr/include/netdb.h:181: error: parse error before "size_t"
    /usr/include/netdb.h:232: error: parse error before "size_t"
    /usr/include/netdb.h:238: error: parse error before "size_t"
    /usr/include/netdb.h:244: error: parse error before "size_t"
    /usr/include/netdb.h:304: error: parse error before "size_t"
    /usr/include/netdb.h:310: error: parse error before "size_t"
    /usr/include/netdb.h:315: error: parse error before "size_t"
    /usr/include/netdb.h:370: error: parse error before "size_t"
    /usr/include/netdb.h:375: error: parse error before "size_t"
    /usr/include/netdb.h:380: error: parse error before "size_t"
    /usr/include/netdb.h:430: error: parse error before "size_t"
    /usr/include/gconv.h:176: warning: array __data' assumed to have one element /usr/include/bits/socket.h:237: warning: array__cmsg_data' assumed to have one element
    berlin188:/home/server/c++ # gcc main.c -o main
    main.c:1: error: parse error before '.' token
    In file included from /usr/include/_G_config.h:44,
    from /usr/include/libio.h:32,
    from /usr/include/stdio.h:72,
    from main.c:4:
    /usr/include/gconv.h:72: error: parse error before "size_t"
    /usr/include/gconv.h:88: error: parse error before "size_t"
    /usr/include/gconv.h:97: error: parse error before "size_t"
    /usr/include/gconv.h:174: error: parse error before "size_t"
    /usr/include/gconv.h:177: error: parse error before '}' token
    In file included from /usr/include/libio.h:32,
    from /usr/include/stdio.h:72,
    from main.c:4:
    /usr/include/_G_config.h:47: error: field __cd' has incomplete type /usr/include/\_G\_config.h:50: error: field__cd' has incomplete type
    In file included from /usr/include/stdio.h:72,
    from main.c:4:
    /usr/include/libio.h:350: error: parse error before "size_t"
    /usr/include/libio.h:359: error: parse error before "size_t"
    /usr/include/libio.h:467: error: parse error before "_IO_sgetn"
    /usr/include/libio.h:467: error: parse error before "size_t"
    In file included from main.c:4:
    /usr/include/stdio.h:304: error: parse error before "size_t"
    /usr/include/stdio.h:311: error: parse error before "size_t"
    /usr/include/stdio.h:353: error: parse error before "size_t"
    /usr/include/stdio.h:357: error: parse error before "size_t"
    /usr/include/stdio.h:602: error: parse error before "fread"
    /usr/include/stdio.h:602: error: parse error before "size_t"
    /usr/include/stdio.h:608: error: parse error before "fwrite"
    /usr/include/stdio.h:608: error: parse error before "size_t"
    /usr/include/stdio.h:630: error: parse error before "fread_unlocked"
    /usr/include/stdio.h:630: error: parse error before "size_t"
    /usr/include/stdio.h:632: error: parse error before "fwrite_unlocked"
    /usr/include/stdio.h:632: error: parse error before "size_t"
    In file included from main.c:5:
    /usr/include/stdlib.h:137: error: parse error before "__ctype_get_mb_cur_max"
    In file included from /usr/include/sys/types.h:266,
    from /usr/include/stdlib.h:416,
    from main.c:5:
    /usr/include/bits/pthreadtypes.h:48: error: parse error before "size_t"
    /usr/include/bits/pthreadtypes.h:51: error: parse error before "__stacksize"
    In file included from main.c:5:
    /usr/include/stdlib.h:433: error: parse error before "size_t"
    /usr/include/stdlib.h:462: error: parse error before "size_t"
    /usr/include/stdlib.h:556: error: parse error before "__size"
    /usr/include/stdlib.h:558: error: parse error before "__nmemb"
    /usr/include/stdlib.h:567: error: parse error before "size_t"
    In file included from /usr/include/stdlib.h:578,
    from main.c:5:
    /usr/include/alloca.h:33: error: parse error before "__size"
    In file included from main.c:5:
    /usr/include/stdlib.h:583: error: parse error before "__size"
    /usr/include/stdlib.h:739: error: parse error before "size_t"
    /usr/include/stdlib.h:743: error: parse error before "size_t"
    /usr/include/stdlib.h:812: error: parse error before "size_t"
    /usr/include/stdlib.h:815: error: parse error before "size_t"
    /usr/include/stdlib.h:819: error: parse error before "size_t"
    /usr/include/stdlib.h:822: error: parse error before "size_t"
    /usr/include/stdlib.h:830: error: parse error before "size_t"
    /usr/include/stdlib.h:834: error: parse error before "size_t"
    /usr/include/stdlib.h:841: error: parse error before "mbstowcs"
    /usr/include/stdlib.h:842: error: parse error before "size_t"
    /usr/include/stdlib.h:844: error: parse error before "wcstombs"
    /usr/include/stdlib.h:845: error: parse error before "size_t"
    In file included from main.c:6:
    /usr/include/unistd.h:313: error: parse error before "size_t"
    /usr/include/unistd.h:319: error: parse error before "size_t"
    /usr/include/unistd.h:449: error: parse error before "size_t"
    In file included from main.c:6:
    /usr/include/unistd.h:539: error: parse error before "confstr"
    /usr/include/unistd.h:539: error: parse error before "size_t"
    /usr/include/unistd.h:708: error: parse error before "size_t"
    /usr/include/unistd.h:733: error: parse error before "size_t"
    In file included from main.c:6:
    /usr/include/unistd.h:784: error: parse error before "size_t"
    /usr/include/unistd.h:791: error: parse error before "size_t"
    /usr/include/unistd.h:801: error: parse error before "size_t"
    /usr/include/unistd.h:802: error: parse error before "size_t"
    /usr/include/unistd.h:819: error: parse error before "size_t"
    In file included from main.c:8:
    /usr/include/string.h:39: error: parse error before "size_t"
    /usr/include/string.h:42: error: parse error before "size_t"
    /usr/include/string.h:51: error: parse error before "size_t"
    /usr/include/string.h:58: error: parse error before "size_t"
    /usr/include/string.h:61: error: parse error before "size_t"
    /usr/include/string.h:65: error: parse error before "size_t"
    /usr/include/string.h:86: error: parse error before "size_t"
    /usr/include/string.h:93: error: parse error before "size_t"
    /usr/include/string.h:99: error: parse error before "size_t"
    /usr/include/string.h:106: error: parse error before "strxfrm"
    /usr/include/string.h:107: error: parse error before "size_t"
    /usr/include/string.h:176: error: parse error before "strcspn"
    /usr/include/string.h:180: error: parse error before "strspn"
    /usr/include/string.h:230: error: parse error before "strlen"
    /usr/include/string.h:248: error: parse error before "size_t"
    /usr/include/string.h:253: error: parse error before "size_t"
    /usr/include/string.h:257: error: parse error before "size_t"
    /usr/include/string.h:260: error: parse error before "size_t"
    /usr/include/string.h:263: error: parse error before "size_t"
    /usr/include/string.h:291: error: parse error before "size_t"
    In file included from /usr/include/sys/uio.h:29,
    from /usr/include/sys/socket.h:27,
    from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/bits/uio.h:45: error: parse error before "size_t"
    In file included from /usr/include/sys/socket.h:35,
    from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/bits/socket.h:221: error: parse error before "size_t"
    /usr/include/bits/socket.h:224: error: parse error before "msg_controllen"
    /usr/include/bits/socket.h:227: error: parse error before '}' token
    /usr/include/bits/socket.h:232: error: parse error before "size_t"
    /usr/include/bits/socket.h:239: error: parse error before '}' token
    In file included from /usr/include/netinet/in.h:24,
    from /usr/include/netdb.h:28,
    from main.c:9:
    /usr/include/sys/socket.h:136: error: parse error before "size_t"
    /usr/include/sys/socket.h:143: error: parse error before "size_t"
    /usr/include/sys/socket.h:150: error: parse error before "size_t"
    /usr/include/sys/socket.h:161: error: parse error before "size_t"
    In file included from /usr/include/netdb.h:33,
    from main.c:9:
    /usr/include/rpc/netdb.h:61: error: parse error before "size_t"
    /usr/include/rpc/netdb.h:65: error: parse error before "size_t"
    /usr/include/rpc/netdb.h:69: error: parse error before "size_t"
    In file included from main.c:9:
    /usr/include/netdb.h:162: error: parse error before "size_t"
    /usr/include/netdb.h:169: error: parse error before "size_t"
    /usr/include/netdb.h:175: error: parse error before "size_t"
    /usr/include/netdb.h:181: error: parse error before "size_t"
    /usr/include/netdb.h:232: error: parse error before "size_t"
    /usr/include/netdb.h:238: error: parse error before "size_t"
    /usr/include/netdb.h:244: error: parse error before "size_t"
    /usr/include/netdb.h:304: error: parse error before "size_t"
    /usr/include/netdb.h:310: error: parse error before "size_t"
    /usr/include/netdb.h:315: error: parse error before "size_t"
    /usr/include/netdb.h:370: error: parse error before "size_t"
    /usr/include/netdb.h:375: error: parse error before "size_t"
    /usr/include/netdb.h:380: error: parse error before "size_t"
    /usr/include/netdb.h:430: error: parse error before "size_t"
    /usr/include/gconv.h:176: warning: array __data' assumed to have one element /usr/include/bits/socket.h:237: warning: array__cmsg_data' assumed to have one element

    Ich weiss mir nicht zu helfen ich habe vorher nur unter Windows programmiert und daranne wird es wohl legen hoffe ihr könnt mir helfen 😞

    Gruß



  • Sorry,
    es muss mir irgendein Fehler unterlaufen seien nun geht es ... 😕 😕

    Gruß



  • Ich bekomme es noch nicht so ganz hin mit einer vernünftigen Nachrichtenschleife entwerder bekomme ich beim starten den Fehler segmentation fault oder das Program startet und mach keine Ausgabe mehr :

    test:/home/c++ # ./client
    test:/home/c++ #
    ...

    ...
    while(sockfd != -1) {
     //  std::cout << "sockfd -1" << std::endl;
       FD_ZERO(&fdSetRead);
       FD_SET(sockfd, &fdSetRead);
       while((select(0, &fdSetRead, 0, 0, &timeout)) > 0)
       {
            std::cout << "select" << std::endl;
            if (connect(sockfd, (struct sockaddr *)&their_addr,
            sizeof(struct sockaddr)) == -1) {
            std::cout << "connect" << std::endl ;
            return 1;
            }
    
            //std::cout << "while(1)" << std::endl ;
            if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
            std::cout << "recv" << std::endl ;
            return 1;
            }
    
            buf[numbytes] = '\0';
            std::cout << "Recv : " << buf << std::endl ;
    
      }
     }
            return 0;
    ...
    

    Was mache ich falsch ich bin ratlos ... 🙄
    Gruß



  • In dem Buch "C und Linux" findest du ein Beispiel für einen "interaktiven" Server und einen entsprechenden Client - quasi eine Art Chat-Verbindung, bei der man im Client-Programm etwas eintippen kann, was dann zum Server geht und umgekehrt.
    Den Quelltext für den Client habe ich mal beigefügt, für mehr Infos solltest du dir das Buch mal ansehen.

    /*
        connect.c - einfacher Netzwerk-Client
    */
    
    # include <stdio.h>
    # include <unistd.h>
    # include <string.h>
    # include <sys/types.h>
    # include <sys/socket.h>
    # include <netinet/in.h>
    # include <arpa/inet.h>
    
    int main(int argc, char *argv[])
     {
      static char buffer[256];
      int sock_fd, err, length, port;
      struct sockaddr_in server_addr;
      fd_set input_fdset;
    
      if (argc != 3)
       {
        fprintf(stderr, "Usage: connect ip-addr port\n");
        return(1);
       }
    
      if (sscanf(argv[2], "%d", &port) != 1)
       {
        fprintf(stderr, "connect: bad argument '%s'\n", argv[2]);
        return(1);
       }
    
      sock_fd = socket(PF_INET, SOCK_STREAM, 0);
      if (sock_fd == -1)
       {
        perror("connect: Can't create new socket");
        return(1);
       }
    
      server_addr.sin_family = AF_INET;
      server_addr.sin_port = htons(port);
      err = inet_aton(argv[1], &(server_addr.sin_addr));
      if (err == 0)
       {
        fprintf(stderr, "connect: Bad IP-Address '%s'\n", argv[1]);
        return(1);
       }
    
      err = connect(sock_fd, &server_addr, sizeof(struct sockaddr_in));
      if (err == -1)
       {
        perror("connect: connect() failed");
        return(1);
       }
    
      while (1)
       {
        FD_ZERO(&input_fdset);
        FD_SET(STDIN_FILENO, &input_fdset);
        FD_SET(sock_fd, &input_fdset);
        if (select(sock_fd+1, &input_fdset, NULL, NULL, NULL) == -1)
          perror("connect: select() failed");
        if (FD_ISSET(STDIN_FILENO, &input_fdset))
         {
          if (fgets(buffer, 256, stdin) == NULL)
           {
            printf("connect: Closing socket.\n");
            break;
           }
          length = strlen(buffer);
          send(sock_fd, buffer, length, 0);
         }
        else
         {
          length = recv(sock_fd, buffer, 256, 0);
          if (length == 0)
           {
            printf("Connection closed by remote host.\n");
            break;
           }
          write(STDOUT_FILENO, buffer, length);
         }
       }
    
      close(sock_fd);
      return(0);
     }
    

    Damit kannst du z. B. mal einen SMTP-Server kontaktieren.

    Martin


Anmelden zum Antworten