【发布时间】:2015-04-01 13:57:00
【问题描述】:
我开发了一个包含小型 http 服务器的应用程序。
我的应用程序在启动时启动。如果应用程序正常停止(etc/init.d/myappli stop),套接字将被关闭
close (socket_desc);
但如果我用kill -9 杀死它,套接字将不会关闭
http 服务器代码:
void http_server_init(void)
{
struct sockaddr_in server;
int cr_port;
for(;;) {
cr_port = conf.port;
int i = (DEFAULT_PORT == cr_port)? 1 : 0;
//Create socket
cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (cr_socket_desc == -1)
{
LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
sleep(1);
continue;
}
/* enable SO_REUSEADDR */
int reusaddr = 1;
if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
for(;;i++) {
server.sin_port = htons(cr_port);
//Bind
if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
cr_port = DEFAULT_PORT + i;
LOG (INFO,"Trying to use another port: %d", cr_port);
continue;
}
break;
}
break;
}
LOG (INFO,"server initiated with the port: %d", cr_port);
}
问题:
1) 如果程序被杀,如何关闭socket?
2)在这种情况下应该使用什么类型的套接字来避免套接字不会被另一个使用tcp套接字的进程使用?
【问题讨论】:
-
当你的进程退出时,所有文件描述符都会被操作系统关闭,所以不用担心。
-
由于 SIGKILL (-9) 无法处理,
close()应该由操作系统自动完成。你有这方面的问题吗? -
什么观察让你觉得“套接字不会被关闭”?
-
因为端口被另一个进程占用了!!!!
-
如果您正在关闭进程并立即尝试重新启动它,则连接可能只是处于
TIME_WAIT状态一段时间,这是正常的。