2011-08-19 8 views
1

논 블로킹 소켓 연결을 사용하고 싶지만 기본 개념을 이해하기위한 예제를 찾을 수 없습니다. 서버에 연결할 때 프로그램 실행을 차단하지 않을 클라이언트가 필요합니다.Perl 논 블로킹 소켓

use IO::Socket; 
use IO::Select; 
use strict; 
$|=1; 
my $host="10.0.0.12"; 
my $SELECT = new IO::Select; 
print "Connecting..."; 
my $sock=new IO::Socket::INET (
    PeerAddr => $host, 
    PeerPort => 3128, 
    Proto => 'tcp', 
    Blocking => 0); 
    if(!$sock) 
    { 
     print "Could not create socket: $!n"; 
    } 
    #print "ok\n"; 
    $SELECT->add($sock); 
    my $buf; 
    while (1){ 
    if($sock and $sock->connected()) 
    { 
     print "ok\n"; 
    } 
    while (my @ready=$SELECT->can_read(0.5)) 
    { 
     foreach my $child (@ready) 
     { 
      if(!sysread($child, $buf, 256)) 
      { 
       $SELECT->remove($child); 
       next; 
      } 

     } 
    } 
    sleep 1; 
} 

소켓 $ sock- 연결> 연결()가 true를 반환하고 내가 뭔가를 할 수 있습니다 지금 나는 다음과 같은 코드가 있습니다. 하지만 소켓에서 시간 초과를 확인하는 방법은 무엇입니까? 연결할 수없고 시간 초과로 닫힌 경우 확인할 수 없습니다! 내가 어떻게 해?

올린 사람 : 아, 봐! 제한 시간이 만료 될 때 코드의 조각

if(!sysread($child, $buf, 256)) 
{ 
    $SELECT->remove($child); 
    next; 
} 

소켓을 닫습니다!

+0

http://www.lowtek.com/sockets/select.html에서 기본적으로 설명합니다. Perl이 아니라 C를위한 것이 든 상관 없습니다. 원칙은 동일합니다. – tripleee

+0

그 예는 서버 측을 보여 주며 시간 제한에 대해서는 신경 쓰지 않습니다. 만료 된 후 소켓이 닫힙니다. 클라이언트 측이 필요하고 닫을 때를 알아야합니다. – Shura

답변

1

소켓 컨텍스트에서 "차단"은 연결이 아닌 소켓 읽기/쓰기 작업과 관련이 있습니다. 당신은 당신이 보통 IO::Socket 생성자에서

Timeout => $max_seconds_to_wait 

매개 변수와 함께 할 수있는 소켓 연결에 시간 제한을 설정에 관심이 있습니다.

+0

new()에 'Timeout'을 추가하면 만료 된 프로그램 실행이 중지됩니다. 이제, Timeout을 사용하지 않고도 필요한 부분을 정확히 만들 수 있습니다. new()는 즉시 반환됩니다. 나는 시험했다. 하지만 타임 아웃이 만료 된 시점을 알아야합니다. – Shura

관련 문제