我有一台服务器接收来自其他各种本地进程的命令。
我选择了最简单的形式(带有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 :(得分:0)
你在哪里关闭'newsockfd'?此外,无法保证缓冲区包含以null结尾的字符串,因此在其上调用printf(%s ..)可能会出现段错或其他UB。