Плохой файловый дескриптор с закрытой () сокет (C ++)

StackOverflow https://stackoverflow.com/questions/2674913

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня нет дескрипторов файлов, когда моя программа не может подключить другой хост. Системный вызов Close () не работает, увеличивается количество открытых розеток. Я могу посмотреть это с

CAT / PROC / SYS / FS / FILE-NR

Печать из консоли:

Connect: нет маршрута к хосту

Закрыть: плохой файл дескриптор

Connect: нет маршрута к хосту

Закрыть: плохой файл дескриптор

..

Код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <iostream>
using namespace std;

#define PORT            1238
#define MESSAGE         "Yow!!! Are we having fun yet?!?"
#define SERVERHOST      "192.168.9.101"

void
write_to_server (int filedes)
{
  int nbytes;

  nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
  if (nbytes < 0)
    {
      perror ("write");
    }
}

void
init_sockaddr (struct sockaddr_in *name,
               const char *hostname,
               uint16_t port)
{
  struct hostent *hostinfo;

  name->sin_family = AF_INET;
  name->sin_port = htons (port);
  hostinfo = gethostbyname (hostname);
  if (hostinfo == NULL)
    {
      fprintf (stderr, "Unknown host %s.\n", hostname);
    }
  name->sin_addr = *(struct in_addr *) hostinfo->h_addr;
}

int main() 
{
 for (;;)
 {
  sleep(1);
  int sock;
  struct sockaddr_in servername;

  /* Create the socket. */
  sock = socket (PF_INET, SOCK_STREAM, 0);
  if (sock < 0)
  {
   perror ("socket (client)");
  }

  /* Connect to the server. */
  init_sockaddr (&servername, SERVERHOST, PORT);
  if (0 > connect (sock,
    (struct sockaddr *) &servername,
    sizeof (servername)))
  {
   perror ("connect");
   sock = -1;
  }

  /* Send data to the server. */
  if (sock > -1)
   write_to_server (sock);
  if (close (sock) != 0)
   perror("close");
 }
return 0;
}

Исправить:

  if (0 > connect (sock,
    (struct sockaddr *) &servername,
    sizeof (servername)))
  {
   perror ("connect");
  }

  else
   write_to_server (sock);

  if (close (sock) != 0)
   perror("close");
Это было полезно?

Решение

Похоже, проблема в структуре вашей программы. Каждый раз через вашу бесконечную петлю вы создаете новую розетку. Я бы предложил переместить это из цикла и повторно использовать его.

Если вы хотите просто исправить, как вы это делаете, хотя, используйте близко внутри «Connect», если вы не удалитесь, если вы уже есть. Дескриптор выделяется вызовом «сокета» и подключен только с вызовом «Connect». Установив вашу переменную «SOCK» к -1, вы бросаете дескриптор, выделенный «сокетом». Колл близко, тогда Установите его на -1, и вы должны быть установлены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top