Pokaż wyniki 1 do 5 z 5

Temat: [PERL] blokowanie gniazd

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1

    Question [PERL] blokowanie gniazd

    Witam wszystkich mam pytanie załóżmy że tworze jakiś program w perlu który łączy się ze stroną internetową np google za pomocą IO::Socket w perlu no to klepie sobie

    Kod:
    $sock=new IO::Socket::INET->new(
    				PeerPort=>'80', 
    				Proto=>   'tcp', 
    				PeerAddr=>'173.194.35.191',
    				Timeout=> '40') or die
    Odpala się gniazdo i następuje podłączenie do strony www (czy podanego hosta na port 80 jak kto woli) teraz wysyłam do otworzonego gniazda dane które ma wysłać no to wpisuje kod:
    Kod:
    $sock->send("GET / HTTP/1.1\r\n...");
    kolejno odczytuje odpowiedź od servera
    Kod:
    $sock->recv($zmienna,1024);
    no i tu zaczyna się mój dylemat gdyż tak naprawdę użycie opcji recv wiąże się z zablokowaniem gniazda gdy nie ma odpowiedzi gniazdo przechodzi w tryb nasłuchu i czeka na odpowiedź aż do momentu w którym ono przyjdzie z czego nie jestem zadowolony czy da rade zrobić by gniazdo się nie blokowało tzn używam recv i nie ma odpowiedzi funkcja wywołana zwraca -1 który oznacza ze odpowiedź jeszcze nie przyszła i wykonuje sobie dalsza część kodu ?
    W C++ jest taka możliwość dzięki której gniazdo nie ma prawa się zablokować czy istnieje taka możliwość w Perlu ?

    Mam nadzieję że nie pomieszałem tego za bardzo i z góry dziękuje za odpowiedzi.
    Ostatnio edytowane przez szlagus : 03-20-2012 - 11:12

  2. #2
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Dokumentacja odpowiada na pytanie :-)

    Kod:
    $sock=new IO::Socket::INET->new(
                                    ....
                                    Blocking => 0,
                                    .... );
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3

    Domyślnie

    Działa dzięki.
    Jeszcze jedno pytanko tworze sobie funkcje

    Kod:
     sub cos {
    print "bleble";
    return "start";
    }
    i odpalam ją w nowym wątku za pomocą:
    $w = Thread->new(\&cos);

    jak zrobić by zwrócić rezultat z funkcji ?
    albo żeby funkcja "cos" dodała jakąś wartość do zmiennej która jest zdefiniowana przed nią ?
    Ostatnio edytowane przez szlagus : 03-20-2012 - 10:57

  4. #4
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Nie bardzo wiem dlaczego chcesz uzywac thread'ow ale...

    $w w tym wypadku to bedzie Twoj thread, wiec jesli chcesz aby funkcja wykonala jakies operacje na zmiennej, to zwyczajnie przekaz jej parametr ktory funkcja moze zmodyfikowac zamiast probowac zlapac wartosc zwracana przez return()

    Sa dwa wywolania - &cos($zmienna) i &cos(\$zmienna) - jest miedzy nimi prosta roznica... pierwsze przekazuje parametr i mozesz go odczytac z tablicy @_ wewnatrz funkcji (albo po prostu zrobic shift) i bedziesz pracowal na kopii zmiennej - wtedy wynik przypisujesz bezposrednio do $zmienna i jesli nie skopales czegos w zakresie widocznosci zmiennych to bedzie ok. Drugi wariant przekazuje referencje (tak jak wskaznik w C) do faktycznej zmiennej. Referencja jest skalarem tak na prawde, wskazujacym na inna zmienna wiec mozna sie do niej dobrac (na przykladzie skalara) piszac:

    Kod:
    sub cos {
      $input = shift;
      print "przekazany skalar ma wartosc $$input\n"; 
      # moze byc tez ${$input} dla czytelnosci
      # zamieniamy ciagi wiecej niz jednej spacji/tablulacji na pojedyncze spacje
      $$input =~ s/\s+/ /g;
    }
    ta operacja na skalarze odbyla sie na zmiennej ktora przekazales do cos() jako referencje - nie robiono kopii, nie zwracano wyniku - bezposrednio zmodyfikowano zmienna. Ja bym powiedzial ze tak powinno sie to robic i sam zauwazysz jak wejdziesz w obiektowke (juz wszedles uzywajac Threads) :-P
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5

    Domyślnie

    Ok zrozumiałem dzięki za wyczerpujące odpowiedzi.

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj