2016-09-12 21 views
8

ben perl'de soket bağlantısı kullanarak basit bir kod programlama ediyorum: Sonra bir döngü kullanarak veri göndermeKontrol eğer

$sock = new IO::Socket::INET(
        PeerAddr => '192.168.10.7', 
        PeerPort => 8000, 
        Proto => 'tcp'); 
$sock or die "no socket :$!"; 

:

while... 
print $sock $str; 
...loop 

bir yolu var mı Döngüye bağlantıyı kontrol etmek için bir komut eklemek? gibi şey:

while... 
    socket is up? 
    yes => send data 
    no => connect again and the continue with loop 
...loop 

DÜZENLEME MY CODE ADD:

my $sock = new IO::Socket::INET(
        PeerAddr => '192.168.10.152', 
        PeerPort => 8000, 
        Proto => 'tcp'); 
    $sock or die "no socket :$!"; 

    open(my $fh, '<:encoding(UTF-8)', 'list1.txt') 
     or die "Could not open file $!"; 

    while (my $msdn = <$fh>) { 
     my $port="8000"; 
     my $ip="192.168.10.152"; 
     unless ($sock->connected) { 
      $sock->connect($port, $ip) or die $!; 
    } 
    my $str="DATA TO SEND: " . $msdn; 
    print $sock $str; 
    } 
    close($sock); 

cevap

13

IO::Socket::INET bir connected method sahiptir IO::Socket bir alt sınıf vardır.

Yuva bağlı durumda ise eş adres döndürülür. Soket bağlı durumda değilse, undef geri döner.

Sen döngü içinde onu kullanabilirsiniz ve üzerinde call connect onay undef döndü eğer.

my $sock = IO::Socket::INET->new(
    PeerAddr => '192.168.10.7', 
    PeerPort => 8000, 
    Proto => 'tcp' 
); 
$sock or die "no socket :$!"; 

while (1) { 
    unless ($sock->connected) { 
     $sock->connect($port, $ip) or die $!; 
    } 
    # ... 
} 
+2

evet ama bu her zaman http://perldoc.perl.org/IO/Socket.html#connected yeterli değildir (ayrıca 'dönüş değerini kontrol etmelidir -> write()') –

+0

Üzgünüm ama anlamıyorum Zaten bir dosyayı okuyabilmek için bir döngüye sahibim, hat satırında ve sonra da sunucunun içine veri gönderiyorum. Bu mükemmel çalışır, Ama, eğer, bazı nedenlerden dolayı, sunucu, tüm satırları bitirmek bitirmeden uygulama, bağlantıyı kapatır. $ socket-> bağlı değilse, $ socket-> connect'i nasıl uygulayabilirim? bir şekilde döngüden veri göndermeye devam etmeden önce tekrar bir yuva oluşturabilir (tekrar bağlanabilirsiniz). –

+0

@LucasRey Yeni bir soket oluşturmanız gerektiğini düşünmüyorum. Sadece bu bağlantıyı yeniden yapmak istiyorsunuz. Döngünün üst kısmına koyun (benim (while) (1) sadece örnekte bir döngü var) ve bundan sonra yaz. Bu yapmalı. – simbabque