2010-04-20 145 views
1

當我的程序無法連接其他主機時,我的文件描述符用完了。 close()系統調用不起作用,打開套接字的數量增加。我本身它使用close()套接字(C++)的錯誤文件描述符

執行cat/proc/SYS/FS /文件-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; 
} 

修復:

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

    else 
    write_to_server (sock); 

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

回答

10

看起來問題出在你的程序的結構。每次通過無限循環,您都在創建一個新的套接字。我建議將其移出循環並重新使用它。

如果您想立即修復您現在正在執行的操作,請在現在使用的「連接」失敗if語句中使用close。描述符由「套接字」呼叫分配,並且只與「連接」呼叫連接。通過設置你的'sock'變量爲-1,你扔掉'socket'分配的描述符。致電關閉,然後將其設置爲-1,您應該設置。

+0

+1:即使連接失敗,仍然需要關閉套接字而不是扔掉手柄。 – 2010-04-20 12:45:35

+0

thx問題修復 – user321246 2010-04-20 15:59:26

相關問題