我有一個關於如何使用IO :: Socket的問題;我有一個應該不斷運行的腳本,監視某個事件的Asterisk服務器。當這些事件發生時,腳本通過TCP套接字將事件中的數據發送到另一臺服務器。偶爾我發現,socket會關閉。我的問題是我是否應該使用一個套接字,並永遠保持打開狀態(並弄清楚爲什麼+阻止它關閉),還是應該爲發送的每一位數據打開並關閉一個新套接字?
我對這類事情的經歷非常少,我讀過所有的文檔,但沒有找到我正在尋找的答案。下面是我到目前爲止已經有了一個樣本:在perl中正確使用IO :: Socket :: INET用於TCP客戶端
#!/usr/bin/perl
use Asterisk::AMI;
use IO::Socket;
use strict;
use warnings;
my $sock = new IO::Socket::INET (
PeerAddr => '127.0.0.1',
PeerPort => '1234',
Proto => 'tcp',
);
sub newchannel {
my ($ami, $event) = @_;
if ($event->{'Context'} eq "from-trunk") {
my $unique_id = $event->{'Uniqueid'};
my $this_call = $call{$unique_id};
$this_call->{caller_name} = $event->{'CallerIDName'};
$this_call->{caller_number} = $event->{'CallerIDNum'};
$this_call->{dnis} = $event->{'Exten'};
$call{$unique_id} = $this_call;
};
}
sub ringcheck {
my ($ami, $event) = @_;
if ($event->{SubEvent} eq 'Begin') {
my $unique_id = $event->{UniqueID};
if (exists $call{$unique_id}) {
my $this_call = $call{$unique_id};
$this_call->{system_extension} = $event->{Dialstring};
$this_call->{dest_uniqueid} = $event->{DestUniqueID};
printf $sock "R|%s|%s|%s||%s\n",
$this_call->{caller_name},
$this_call->{caller_number},
$this_call->{system_extension},
$this_call->{dnis};
$this_call->{status} = "ringing";
}
}
還有比這更給它一點,但是這顯示了,我覺得我應該開始/停止新的套接字(在ringcheck子內) 。
讓我知道如果你需要我澄清或添加任何東西。
謝謝!
開銷並不重要。這全是局域網,並且可能每10分鐘少於一條消息。遠端沒有發回任何東西。沒有什麼重要的事情可以用來做這些事情;我沒有看到沒有打開連接的理由。我的部分問題是,我無法訪問此連接的另一端,因此必須使用我所擁有的功能來排除故障。你的回答非常有幫助,我會嘗試Keepalive選項,並在今天晚些時候再回來查看。再次感謝。 – lorsungcu
似乎已經工作了,從那以後沒有下降過。謝謝你的偉大答案。 – lorsungcu