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);
}
我們可以看到一些代碼嗎?具體來說,你指的是無限循環。謝謝 – Fred
你在哪裏關閉'newsockfd'?此外,不能保證緩衝區包含以空字符結尾的字符串,因此在其上調用printf(%s ..)可能會出現段錯誤或其他一些UB。 –
就是這樣,謝謝Martin。 – Robby75