简单的网络编程问题

2017-07-28 15:18:19 +08:00
 HxSeek

这是小弟的一个简单的 web 服务器程序,每次我直接用 Ctrl+z 来关闭这个服务器程序时候,之后再重新开启的时候,发现浏览器已经再也打不开这个端口了,我查了一下,服务状态器处于 CLOSE_WAIT 状态, 请问代码应该怎样修改才能避免这种状况,谢谢大家

#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <unistd.h> #include <stdlib.h> int main() { int listenfd; int clientfd; int optval = 1; struct sockaddr_in server_addr; struct sockaddr_in client_addr;

if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    return -1;

setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval, sizeof(int));

memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8000);

if(bind(listenfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < -1)
    return -1;

if(listen(listenfd, 1) < 0)
    return -1;

int client_size = sizeof(client_addr);

while(1)
{
    clientfd = accept(listenfd, (struct sockaddr *)&client_addr, &client_size);

    if(clientfd < 0)
        exit(1);

    write(clientfd, "web server\n", 10);

    close(clientfd);
}

exit(0);

}

2515 次点击
所在节点    程序员
8 条回复
momocraft
2017-07-28 15:22:26 +08:00
如果你是指 shell 中的 ctrl-z: 你其实没有关闭这个进程,只是挂起 (SIGSTOP) 了。
aisk
2017-07-28 15:23:56 +08:00
ctrl z 只是把进程挂到后台,进程其实还在,使用 fg 命令还能恢复。
fyyz
2017-07-28 15:34:16 +08:00
Ctrl + C
HxSeek
2017-07-28 15:37:48 +08:00
@aisk 了解,谢谢
am241
2017-07-28 15:42:48 +08:00
相关命令 jobs, fg
qucklay
2017-07-28 17:02:50 +08:00
ctrl z 进程后台停止,然后 jobs 查看几号,bg %1 放后台执行。
fg %1 切换到前台执行,ctrl c 关闭进程
pqee
2017-07-28 17:03:10 +08:00
第一次知道 ctrl-z。。。
yumemor
2017-07-29 00:50:37 +08:00
lsof -i port 看看是谁占用了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/378629

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX