2010-04-20 2 views
1

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

кот/Труды/системы/фс/файл-Nr

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

подключения: Нет маршрута для размещения

близко: Плохой дескриптор файла

подключение: нет путей сообщения

близко: Плохой дескриптор файла

..

Код:

#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; 
} 

Fix:

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

    else 
    write_to_server (sock); 

    if (close (sock) != 0) 
    perror("close"); 

ответ

10

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

Если вы хотите просто исправить то, как вы это делаете сейчас, воспользуйтесь закрытием внутри «connect» failed, если у вас есть утверждение. Дескриптор назначается вызовом «сокет» и связан только с вызовом «connect». Установив переменную «носок» в -1, вы выбрасываете дескриптор, назначенный «сокетом». Call close, , затем установите значение -1, и вы должны быть установлены.

+0

+1: Несмотря на то, что соединение завершается с ошибкой, вам все равно нужно закрыть розетку, а не выбрасывать ручку. –

+0

thx проблема исправлена – user321246