免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3172 | 回复: 2
打印 上一主题 下一主题

[已解决](Socket) 一个client连接多个server 断开一个server client莫名终止 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-22 13:01 |只看该作者 |倒序浏览
程序目的描述

一个客户端程序同时连接多个服务器端。

问题描述

当一个服务器端断开后,客户端会莫名终止。

调试信息

服务器端终端 (启动server)
[root@host test]# ./server.pl 1 &
[1] 9740
[root@host test]# ./server.pl 2 &
[2] 9753
[root@host test]# ./server.pl 3 &
[3] 9762


客户端终端 (正常)
[root@host test]# ./client.pl
a
a -- host:1
a -- host:3
a -- host:2
...
f
f -- host:1
f -- host:3
f -- host:2


服务器端终端 (杀掉一个)
[root@host test]# kill -9 9762


客户端终端 (g部分是正确的,可再输入就直接退出了)
g
g -- host:1
g -- host:2
h
[root@host test]#


退出的位置

client.pl 中的 $servers{$one}->send($cmd . $EOL, 0);

以下是测试代码

#!/usr/bin/perl


#

# 客户端代码

#

# 文件名 client.pl

# 用法 ./client.pl

#


use strict;
use warnings;
use IO::Socket;

my $EOL = "\x0D\x0A";

my %servers = ();
my @myArray = (1..3);
foreach my $one (@myArray) {
        my $temp = IO::Socket::INET->new(
                Proto           => "tcp",
                PeerAddr        => '127.1',
                PeerPort        => 11100 + $one,
                Reuse           => 1
        );

        $servers{$one} = $temp if defined($temp);
}

while (1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $cmd = <STDIN>;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cmd =~ s/^\s*|\s*$//g;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last if $cmd =~ m/^(exit|quit)$/;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $one (keys %servers) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$servers{$one}->send($cmd . $EOL, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach my $one (keys %servers) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defined(my $result = readline($servers{$one})) or next;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $result;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
}

foreach my $one (keys %servers) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close($servers{$one});
}



#!/usr/bin/perl


#

# 服务器端代码

#

# 文件名 server.pl

# 用法 ./server.pl 服务器编号

#


use strict;
use warnings;
use IO::Socket;

my $EOL = "\x0D\x0A";

my $server = IO::Socket::INET->new(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Proto           => "tcp",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalAddr       => '127.1',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalPort       => 11100 + $ARGV[0],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reuse           => 1
);

$server->bind('local');
$server->listen();

while (1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $client = $server->accept();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (1) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defined(my $result = readline($client)) or last;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result =~ s/^\s*|\s*$//g;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result .= " -- host:$ARGV[0]" . $EOL;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print $result;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$client->send($result, 0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close ($client);
}

close($server);


[ 本帖最后由 kinpoo 于 2008-1-22 13:43 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-01-22 13:07 |只看该作者
1,精心设计你的协议,以避免接收到 SIGPIPE,
或者,更合理的做法:
2,$SIG{PIPE} = sub {};

[ 本帖最后由 flw 于 2008-1-22 13:35 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-01-22 13:18 |只看该作者
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP