2014-01-07 65 views
0

我有一臺服務器接收來自各種其他本地進程的命令。如何在不泄漏資源的情況下使用AF_UNIX套接字?

我選擇了最簡單的形式(無限循環accept-read),但這裏套接字連接保持打開狀態,我很快就會耗盡它們(運行在虛擬主機上)。然後,在客戶端上,socket()失敗並顯示錯誤消息「無法分配內存」。 (但是內存沒有問題,那肯定是從虛擬主機的一些插座限制。)

我也試圖在一個無限循環,這也確實解決問題的整個事情(unlink-socket-bind-accept-listen-read-close) 。其中一個命令似乎抓住了永遠不會釋放的套接字連接。 (只有殺死並重新啓動服務器進程才允許客戶端再次連接)在close()之前使用shutdown()也無濟於事。

套接字的類型是AF_UNIX/SOCK_SEQPACKET。

如何在不泄漏系統資源的情況下使用套接字?

編輯:按照要求在服務器的無限循環:

while(1) 
{ 
    unlink(SOCKET_FILE_PATH);  
    if((socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0)) < 0) 
    { 
     perror("socket() failed"); 
     return 1; 
    } 
    if(bind(socket_fd, (const struct sockaddr *) &server_address, sizeof(server_address)) < 0) 
    { 
     close(socket_fd); 
     perror("bind() failed"); 
     return 1; 
    } 
    listen(socket_fd, 10); 
    newsockfd = accept(socket_fd, (struct sockaddr *)&cli_addr, &clilen); 
    if (newsockfd < 0) 
    { 
     perror("ERROR on accept"); 
     return 1; 
    } 
    bzero(buffer,256); 
    n = read(newsockfd,buffer,255); 
    if (n < 0) 
    { 
     perror("ERROR reading from socket"); 
     return 1; 
    } 
    printf("buffer: \"%s\"\n",buffer); 
    shutdown(socket_fd, SHUT_RDWR); 
    close(socket_fd); 
} 
+0

我們可以看到一些代碼嗎?具體來說,你指的是無限循環。謝謝 – Fred

+1

你在哪裏關閉'newsockfd'?此外,不能保證緩衝區包含以空字符結尾的字符串,因此在其上調用printf(%s ..)可能會出現段錯誤或其他一些UB。 –

+0

就是這樣,謝謝Martin。 – Robby75

回答

0

你在哪裏關閉 'newsockfd'?此外,不能保證緩衝區包含以空字符結尾的字符串,因此在其上調用printf(%s ..)可能會出現段錯誤或其他一些UB。