如何在不泄漏资源的情况下使用AF_UNIX套接字?

时间:2014-01-07 13:53:11

标签: sockets memory-leaks

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

我选择了最简单的形式(带有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);
}

1 个答案:

答案 0 :(得分:0)

你在哪里关闭'newsockfd'?此外,无法保证缓冲区包含以null结尾的字符串,因此在其上调用printf(%s ..)可能会出现段错或其他UB。