请教TCP Socket的编程问题
时间:2010-12-27
来源:互联网
下面这段代码是一个TCP socket编写的网络服务器程序,请问,为什么它在接收并处理完第一个request后就退出了?
复制代码
- #!/usr/bin/perl
-
- use Socket;
- use POSIX qw(:sys_wait_h);
-
- sub REAPER {
- 1 until -1 == waitpid(-1, WNOHANG);
- $SIG{CHLD} = \&REAPER;
- }
-
- $SIG{CHLD} = \&REAPER;
-
- socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
- setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
- $my_addr = sockaddr_in(8080, INADDR_ANY);
- bind SERVER, $my_addr;
- listen(SERVER, 1000);
- REQUEST:
- while (accept(CLIENT, SERVER)) {
- if ($pid = fork) {
- close CLIENT;
- next REQUEST;
- }
- die "$!" unless defined $pid;
- close SERVER;
- print CLIENT "hello\n";
- close CLIENT;
- exit;
- }
作者: lululau 发布时间: 2010-12-27
StackOverflow上有哥们给了个解答,说accept会被SIGCHLD中断,下面是他给出的代码
复制代码
- #!/usr/bin/perl
-
- use strict;
- use warnings;
- use Socket;
- use POSIX qw(:sys_wait_h);
-
- sub REAPER {
- local $!; # Don't let signal handler mess with $!
- 1 until -1 == waitpid(-1, WNOHANG);
- $SIG{CHLD} = \&REAPER;
- }
-
- $SIG{CHLD} = \&REAPER;
- socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
- setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1);
- my $my_addr = sockaddr_in(8080, INADDR_ANY);
- bind SERVER, $my_addr;
- listen(SERVER, 1000);
- REQUEST:
- while (1) {
- my $paddr = accept(CLIENT, SERVER) || do {
- # try again if accept() returned because a signal was received
- next REQUEST if $!{EINTR};
- die "accept: $!";
- };
-
- my $pid;
- if ($pid = fork) {
- close CLIENT;
- next REQUEST;
- }
- die "$!" unless defined $pid;
- close SERVER;
- print CLIENT "hello\n";
- close CLIENT;
- exit;
- }
作者: lululau 发布时间: 2010-12-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28