亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 求教IO::Socket::INET 本地端口釋放問題,求高手解惑! [打印本頁]

作者: meihuaqi    時間: 2010-03-17 10:57
標題: 求教IO::Socket::INET 本地端口釋放問題,求高手解惑!
求教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     <-----上次執(zhí)行時端口沒釋放


###########################
抓包看了,連接確實斷了,但是那個端口不能重復使用了,必須等超時之后才可用
作者: meihuaqi    時間: 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)
作者: Pro_sky    時間: 2010-03-17 11:52
IO::Socket::INET,這個包是有問題的
作者: 黑色陽光_cu    時間: 2010-03-17 13:14
本帖最后由 黑色陽光_cu 于 2010-03-17 13:21 編輯

用了ReusePort Reuse后 試試把那句shutdown去掉 用了shutdown會發(fā)送FIN

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

還不行試試use Socket;
作者: meihuaqi    時間: 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
作者: 黑色陽光_cu    時間: 2010-03-17 13:43
你原來的

$socket->shutdown(1);

這個會發(fā)FIN包吧?
作者: meihuaqi    時間: 2010-03-17 13:45
$socket->shutdown(1);

會發(fā)FIN包
作者: meihuaqi    時間: 2010-03-17 13:49
他老母的,去掉 $socket->shutdown(1); 之后原來那腳本也好使了,為啥呢?
作者: 黑色陽光_cu    時間: 2010-03-17 13:58
他老母的,去掉 $socket->shutdown(1); 之后原來那腳本也好使了,為啥呢?
meihuaqi 發(fā)表于 2010-03-17 13:49



   


不告訴你
作者: meihuaqi    時間: 2010-03-17 14:13
高手,太小氣了
作者: meihuaqi    時間: 2010-03-17 14:18
回復 9# 黑色陽光_cu


    我也知道了,一定是bug,^_^o(∩_∩)o...哈哈
作者: 黑色陽光_cu    時間: 2010-03-17 14:19
高手,太小氣了
meihuaqi 發(fā)表于 2010-03-17 14:13





發(fā)了FIN,會有什么結果?
作者: meihuaqi    時間: 2010-03-17 14:25
回復 12# 黑色陽光_cu


    tcp半關閉,客戶端不再向服務器寫東西了,應該是這樣吧,如果連這個都記錯了我就不活了
作者: 黑色陽光_cu    時間: 2010-03-17 14:33
shutdown(1)后,是這個順序:

FIN_WAIT_2
TIME_WAIT
CLOSED

用了Reuse后,直接關閉是發(fā)送RST包吧?
作者: meihuaqi    時間: 2010-03-17 14:44
回復 14# 黑色陽光_cu


害我又試了一次,   
用了Reuse后,直接關閉還是發(fā)fin,
去掉shutdown(1)后和用不用Reuse沒關系,本地端口都能釋放。

#########################################################
AN# tcpdump -i em0 host 172.16.63.31
tcpdump: listening on em0
14:32:36.523200 172.16.63.204.callbook > 172.16.63.31.http: S 1548261975:1548261975(0) win 65535 <mss 1460,nop,wscale 3,sackOK,timestamp 1636264264 0> (DF)
14:32:36.523223 172.16.63.31.http > 172.16.63.204.callbook: S 817184642:817184642(0) ack 1548261976 win 17520 <mss 1460> (DF)
14:32:36.523526 172.16.63.204.callbook > 172.16.63.31.http: . ack 1 win 65535 (DF)
14:32:36.523693 172.16.63.204.callbook > 172.16.63.31.http: P 1:67(66) ack 1 win 65535 (DF)
14:32:36.523698 172.16.63.204.callbook > 172.16.63.31.http: F 67:67(0) ack 1 win 65535 (DF)       <-------fin
14:32:36.523772 172.16.63.31.http > 172.16.63.204.callbook: . ack 68 win 17519
14:32:36.525957 172.16.63.31.http > 172.16.63.204.callbook: P 1:256(255) ack 68 win 17519
14:32:36.525978 172.16.63.31.http > 172.16.63.204.callbook: F 256:256(0) ack 68 win 17519
14:32:36.526193 172.16.63.204.callbook > 172.16.63.31.http: . ack 257 win 65444 (DF)
^C
110 packets received by filter
0 packets dropped by kernel
AN# tcpdump -i em0 host 172.16.63.31
tcpdump: listening on em0
14:37:34.030999 172.16.63.204.dc > 172.16.63.31.http: S 2259249956:2259249956(0) win 65535 <mss 1460,nop,wscale 3,sackOK,timestamp 1636561712 0> (DF)
14:37:34.031023 172.16.63.31.http > 172.16.63.204.dc: S 1048807345:1048807345(0) ack 2259249957 win 17520 <mss 1460> (DF)
14:37:34.031159 172.16.63.204.dc > 172.16.63.31.http: . ack 1 win 65535 (DF)
14:37:34.031492 172.16.63.204.dc > 172.16.63.31.http: P 1:67(66) ack 1 win 65535 (DF)
14:37:34.033591 172.16.63.31.http > 172.16.63.204.dc: P 1:256(255) ack 67 win 17520
14:37:34.033612 172.16.63.31.http > 172.16.63.204.dc: F 256:256(0) ack 67 win 17520               <---fin
14:37:34.033992 172.16.63.204.dc > 172.16.63.31.http: . ack 257 win 65445 (DF)
14:37:34.035832 172.16.63.204.dc > 172.16.63.31.http: F 67:67(0) ack 257 win 65535 (DF)
14:37:34.035852 172.16.63.31.http > 172.16.63.204.dc: . ack 68 win 17519
作者: 黑色陽光_cu    時間: 2010-03-17 15:26


是LINGER才會讓close直接發(fā)RST 記錯了
作者: 黑色陽光_cu    時間: 2010-03-17 15:51
本帖最后由 黑色陽光_cu 于 2010-03-17 16:15 編輯

我自己的程序用了SO_LINGER,關閉時會直接發(fā)RST。但在close之前用了shutdown(2)就會引起正常關閉,導致大量的TIME_WAIT鏈接。你的問題,猜測是shutdown讓套接字進入了什么狀態(tài),導致端口重用不了。

“SO_REUSEADDR用于對TCP套接字處于TIME_WAIT狀態(tài)下的socket,才可以重復綁定使用。 ”


windows xp sp3




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2