Sockets 如何使用AF_UNIX套接字而不泄漏资源?

Sockets 如何使用AF_UNIX套接字而不泄漏资源?,sockets,memory-leaks,Sockets,Memory Leaks,我有一个服务器,它接收来自各种其他本地进程的命令 我选择了最简单的形式(使用accept read进行无休止的循环),但这里的套接字连接保持打开状态,很快就用完了(在虚拟主机上运行)。然后,在客户端上,socket()失败,错误消息为“无法分配内存”。(但是内存不是问题,这肯定是虚拟主机的一些套接字限制。) 我还试图让整个过程(取消套接字绑定接受侦听读取关闭)处于无休止的循环中,这也解决了问题。其中一个命令似乎抓住了一个永远不会释放的套接字连接。(只有终止并重新启动服务器进程才允许客户端再次连接

我有一个服务器,它接收来自各种其他本地进程的命令

我选择了最简单的形式(使用
accept read
进行无休止的循环),但这里的套接字连接保持打开状态,很快就用完了(在虚拟主机上运行)。然后,在客户端上,socket()失败,错误消息为“无法分配内存”。(但是内存不是问题,这肯定是虚拟主机的一些套接字限制。)

我还试图让整个过程(
取消套接字绑定接受侦听读取关闭
)处于无休止的循环中,这也解决了问题。其中一个命令似乎抓住了一个永远不会释放的套接字连接。(只有终止并重新启动服务器进程才允许客户端再次连接)在关闭()之前使用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);
}
while(1)
{
取消链接(套接字文件路径);
if((socket\u fd=socket(AF\u UNIX,SOCK\u SEQPACKET,0))<0)
{
perror(“套接字()失败”);
返回1;
}
if(绑定(socket\u fd,(const struct sockaddr*)和服务器地址,sizeof(服务器地址))<0
{
关闭(插座f);
perror(“绑定()失败”);
返回1;
}
听(插座fd,10);
newsockfd=accept(socket\u fd,(struct sockaddr*)&cli\u addr,&clilen);
if(newsockfd<0)
{
perror(“接受错误”);
返回1;
}
b0(缓冲器,256);
n=读取(newsockfd,缓冲区,255);
if(n<0)
{
perror(“从套接字读取错误”);
返回1;
}
printf(“缓冲区:\%s\”\n,缓冲区);
关闭(插座fd、关闭RDWR);
关闭(插座f);
}

在哪里关闭“newsockfd”?此外,不能保证缓冲区包含以null结尾的字符串,因此对其调用printf(%s…)可能会导致segfault或其他UB。

我们可以看到一些代码吗?特别是你提到的无休止的循环。谢谢您在哪里关闭“newsockfd”?此外,也不能保证缓冲区包含以null结尾的字符串,因此对其调用printf(%s…)很可能是segfault或其他UB。就是这样,谢谢Martin。