我有一台服务器正在侦听 tcp 端口。当有传入连接时,它使用accept()
并使用fork()
. 客户端/子进程从连接中读取一些数据并通过管道将其发送回服务器。在此之后,我想关闭连接。我曾尝试从客户端进程中使用shutdown()
并close()
没有太多运气。
我检查了两者的结果,shutdown()
它们close()
都返回 0。所以显然它们运行顺利。在两者都运行之后shutdown()
,close()
服务器sigchld
从子进程接收到一个。这是在一般基础上处理的,但我更愿意在接收信号之前关闭连接。任何有关如何做到这一点的建议将不胜感激。
附带说明一下close()
,已用于关闭整个服务器/客户端程序中不需要的文件描述符和套接字,但现在我不确定它们是否真的被关闭了。
下面是两个代码片段。首先是程序的服务器部分中的accept()
and :fork()
if ((client_s = accept(s, &info.addr, &addrlen)) == -1) {
//Error handling
}
if ((info.pid = fork()) == -1) {
//More error handling
}
else if (info.pid == 0) {
//Closing all unneeded file descriptors
// Set default signal handler for SIGCHLD
signal(SIGCHLD, SIG_DFL);
_exit(clientStatus_main(client_s, info_pipes[1]));
}
else {
//Adding client to list of clients and closing some file descriptors.
close(client_s);
}
最后是来自函数 clientStatus_main 的代码片段:
//Signal handling
signal(SIGINT, client_sighandler);
signal(SIGTERM, client_sighandler);
signal(SIGKILL, client_sighandler);
signal(SIGHUP, client_sighandler);
signal(SIGCHLD, SIG_DFL);
//Read data from socket
read(socket, &status_packet.type, iLength)
//Do data handling and write back to server
write(info_pipe, &status_packet, status_packet.len)
//Close down socket
res = shutdown(socket, SHUT_RDWR);
addlog(LOG_INFO, "Result of shutdown: %i\n", res); //Write to log
res = close(socket);
addlog(LOG_INFO, "Result of close: %i\n", res);
return (iCount > 0 ? 0 : -1);
有什么好主意吗?
*编辑:在阅读了我试图close(client_s)
从父进程中做的评论后,但它并没有解决我的问题。为清楚起见,我还在代码片段中添加了这一行。