免费注册 查看新帖 |

Chinaunix

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

求教IO::Socket::INET 本地端口释放问题,求高手解惑! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-17 10:57 |只看该作者 |倒序浏览
求教IO::Socket::INET 本地端口释放问题,求高手解惑!


###################################################
use IO::Socket;
use Getopt::Std;

my %option;
getopts("u:c:p:", \%option);

my $url=$option{u};
my $cookie=$option{c} if exists($option{c});
my $localport=$option{p};

(my $remote_host, my $uri)= $url=~/http:\/\/(.*?)\/(.*)/;

$remote_port="80";

$socket = IO::Socket::INET->new(PeerAddr => $remote_host,
                                PeerPort => $remote_port,
                                LocalPort => $localport,
                                Proto    => "tcp",
                                Type     => SOCK_STREAM)
    or die "Couldn't connect to $remote_hostremote_port : $@\n";


if (exists($option{c}))
{
        print $socket "GET /hostname.txt HTTP/1.1\r\nHost: 10.3.10.1\r\nCookie: $cookie\r\nConnection: close\r\n\r\n" ;
} else {
        print $socket "GET /hostname.txt HTTP/1.1\r\nHost: 10.3.10.1\r\nConnection: close\r\n\r\n";
}

$socket->shutdown(1);

my $answer=undef;

while (<$socket>
{
        $answer.=$_;
}

print "$answer\n";

close($socket);
#################  运行   ###############
stress204# perl sourceport.pl -u http://172.16.63.31/hostname.txt -p 9999
HTTP/1.1 200 OK
Server: nginx/0.5.33
Date: Wed, 17 Mar 2010 10:52:32 GMT
Content-Type: text/plain
Last-Modified: Tue, 11 Aug 2009 14:53:39 GMT
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Via: 1.1 AN-0001242745426001

172.16.64.207

stress204# perl sourceport.pl -u http://172.16.63.31/hostname.txt -p 9999
Couldn't connect to 172.16.63.31:80 : IO::Socket::INET: Address already in use     <-----上次执行时端口没释放


###########################
抓包看了,连接确实断了,但是那个端口不能重复使用了,必须等超时之后才可用

论坛徽章:
0
2 [报告]
发表于 2010-03-17 11:32 |只看该作者
好像ReusePort,Reuse 能管用,但是试了还是没效果啊,没人知道吗?


$socket = IO::Socket::INET->new(PeerAddr => $remote_host,
                                PeerPort => $remote_port,
                                LocalPort => $localport,
                                Proto    => "tcp",
                                ReuseAddr=> "1",
                                Reuse    => "1",
                                ReusePort=> "1",
                                Type     => SOCK_STREAM)

论坛徽章:
0
3 [报告]
发表于 2010-03-17 11:52 |只看该作者
IO::Socket::INET,这个包是有问题的

论坛徽章:
0
4 [报告]
发表于 2010-03-17 13:14 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-03-17 13:21 编辑

用了ReusePort Reuse后 试试把那句shutdown去掉 用了shutdown会发送FIN

--------------------------------------------------

还不行试试use Socket;

论坛徽章:
0
5 [报告]
发表于 2010-03-17 13:38 |只看该作者
搞定了,use Socket; 希望以后的人少走弯路。
这需求太恶心人了!!!
#######################################
use Socket;
use IO::Handle;
use Getopt::Std;

my %option;
getopts("u:c:p:", \%option);

my $url=$option{u};
my $cookie=$option{c} if exists($option{c});
my $localport=$option{p};

(my $remote_host, my $uri)= $url=~/http:\/\/(.*?)\/(.*)/;

socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$internet_addr = inet_aton($remote_host)
    or die "Couldn't convert $remote_host into an Internet address: $!\n";
$paddr = sockaddr_in("80", $internet_addr);

my $inet_addr = inet_aton("172.16.63.204";
my $localaddr     = sockaddr_in($localport, $inet_addr);
bind(SOCKET, $localaddr)         or die "bind: $!";


connect(SOCKET, $paddr)
    or die "Couldn't connect to $remote_hostremote_port : $!\n";

SOCKET->autoflush(1);

if (exists($option{c}))
{
        print SOCKET "GET /$uri HTTP/1.1\r\nHost: 10.3.10.1\r\nCookie: $cookie\r\nConnection: close\r\n\r\n" ;
} else {
        print SOCKET "GET /$uri HTTP/1.1\r\nHost: 10.3.10.1\r\nConnection: close\r\n\r\n";
}


my $answer=undef;

while (<SOCKET>
{
        $answer.=$_;
}

print "$answer\n";

close(SOCKET);
############  运行  ###################
stress204# perl sourceport2.pl -u http://172.16.63.31/hostname.txt -p 2000
HTTP/1.1 200 OK
Server: nginx/0.5.33
Date: Wed, 17 Mar 2010 13:39:23 GMT
Content-Type: text/plain
Last-Modified: Tue, 11 Aug 2009 14:53:39 GMT
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Via: 1.1 AN-0001242745426001

172.16.64.207

stress204# perl sourceport2.pl -u http://172.16.63.31/hostname.txt -p 2000
HTTP/1.1 200 OK
Server: nginx/0.5.33
Date: Wed, 17 Mar 2010 13:39:24 GMT
Content-Type: text/plain
Last-Modified: Tue, 11 Aug 2009 14:53:39 GMT
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Via: 1.1 AN-0001242745426001

172.16.64.207

论坛徽章:
0
6 [报告]
发表于 2010-03-17 13:43 |只看该作者
你原来的

$socket->shutdown(1);

这个会发FIN包吧?

论坛徽章:
0
7 [报告]
发表于 2010-03-17 13:45 |只看该作者
$socket->shutdown(1);

会发FIN包

论坛徽章:
0
8 [报告]
发表于 2010-03-17 13:49 |只看该作者
他老母的,去掉 $socket->shutdown(1); 之后原来那脚本也好使了,为啥呢?

论坛徽章:
0
9 [报告]
发表于 2010-03-17 13:58 |只看该作者
他老母的,去掉 $socket->shutdown(1); 之后原来那脚本也好使了,为啥呢?
meihuaqi 发表于 2010-03-17 13:49



   


不告诉你

论坛徽章:
0
10 [报告]
发表于 2010-03-17 14:13 |只看该作者
高手,太小气了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP