[Linux] Socketprogrammierung komisches Verhalten



  • Hallo c-community,

    ich beobachte derzeit ein komisches Verhalten bei der Verwendung von Sockets.
    Also ich habe folgedes Quellcode nachprogrammiert:

    /* server.c */
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd. h.>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define BUF 1024
    int main (void) {
      int create_socket, new_socket;
      socklen_t addrlen;
      char *buffer = malloc (BUF);
      ssize_t size;
      struct sockaddr_in address;
      struct timeval tv;
      printf ("\e[2J");
      if ((create_socket=socket (AF_INET, SOCK_STREAM, 0)) > 0)
        printf ("Socket wurde angelegt\n");
      tv.tv_usec = 200;
      setsockopt( create_socket, SOL_SOCKET,
                  SO_RCVTIMEO, (struct timeval*)&tv, sizeof(struct timeval)); //<-- auf diese Stelle beziehe ich mich
      address.sin_family = AF_INET;
      address.sin_addr.s_addr = INADDR_ANY;
      address.sin_port = htons (15000);
      if (bind ( create_socket,
                 (struct sockaddr *) &address,
                 sizeof (address)) != 0) {
        printf( "Der Port ist nicht frei – belegt!\n");
      }
      listen (create_socket, 5);
      addrlen = sizeof (struct sockaddr_in);
      while (1) {
         new_socket = accept ( create_socket,
                               (struct sockaddr *) &address,
                               &addrlen );
         if (new_socket > 0)
          printf ("Ein Client (%s) ist verbunden ...\n",
             inet_ntoa (address.sin_addr));
         do {
            printf ("Nachricht zum Versenden: ");
            fgets (buffer, BUF, stdin);
            send (new_socket, buffer, strlen (buffer), 0);
            size = recv (new_socket, buffer, BUF-1, 0);
            if( size > 0)
               buffer[size] = '\0';
            printf ("Nachricht empfangen: %s\n", buffer);
         } while (strcmp (buffer, "quit\n") != 0);
         close (new_socket);
      }
      close (create_socket);
      return EXIT_SUCCESS;
    }
    

    Quelle: http://openbook.galileocomputing.de/linux_unix_programmierung/Kap11-007.htm#RxxKap110070400038C1F03A107

    Hierbei gibt es jetzt folgendes für mich noch nicht verständliches Problem (an markierter Stelle). Wenn ich die Zeile mit folgender Zeile austausche:

    int ret = setsockopt( create_socket, SOL_SOCKET,
                  SO_RCVTIMEO, (struct timeval*)&tv, sizeof(struct timeval)); //<-- auf diese Stelle beziehe ich mich
    

    Dann ist das accept für den new_socket nicht mehr sperrend. Es gibt einen Wert -1 zurück mit dem Fehler errno 11:

    Ressource temporarily unavailable

    Kann mir jemand sagen, warum dies der Fall ist?

    Vielen Dank
    mirrowwinger



  • und "ret" enthaelt keinen error?



  • nein keine Fehler


Anmelden zum Antworten