Pokaż wyniki 1 do 6 z 6

Temat: Bouncer: pogubiłem się z recv i select.

  1. #1
    Deathplanter jest offline Online since sixteen
    Zarejestrowany
    May 2007
    Postów
    3

    Domyślnie Bouncer: pogubiłem się z recv i select.

    Przekopałem już masę stron dokumentacji, pogooglałem i jaki kod bym nie wrzucił, moje g++ kompiluje go tak, że równie dobrze zamiast funkcji mógłbym wrzucić if(false), bo i tak kod nigdy nie działa jak trzeba.

    Ostatnio zacząłem programować małą aplikację do gry Tibia, którą możnaby postawić na szelu i która pozwalałaby na na przykład skryptowe wykonywanie poleceń pod nieobecność usera. Prace przebiegają ślamazarnie, ale do tej pory z tygodnia na tydzień były postępy. Ba, nawet na sf.net projekt przyjęli

    Problem polega na tym, że ostatnio chciałem dodać obsługę czegoś w rodzaju proxy do mojego programu. Teorię z szyfrowaniem i deszyfrowaniem protokołu, algorytmy RSA i XTEA już przy pomocy cudzych kodów rozwiązałem praktycznie dostępnie, problem tkwi w podstawach...

    Klient na szelu łączy się do serwera Tibii, wchodzi w loopa i parsuje pakiety. Wszystko ślicznie. Chciałbym teraz, żeby, o ile da radę, w tym samym wątku wrzucić wykrywanie czasu jałowego: jeśli socket (int) tak naprawdę nie ma nic do wczytania na buforze, to niech nie wywołuje recv, tylko synchronizuje dane z podłączonym do niego na oddzielnym sockecie drugim klientem. Myślałem, że sprawa będzie banalna dopóki nie okazało się, że uparty recv zajmuje czas procesora aż dostanie dane, więc tak naprawdę nie mogę w tym samym wątku nic wykonać. Czy jest szansa, żeby sprawdzić, czy socket faktycznie ma coś do odczytania w buforze zanim zostanie on wczytany? A może istnieje funkcja, która podaje AKTUALNY stan bufora? Dodawanie nowych wątków raczej nie wchodzi w rachubę, bo sądzę, że wkrótce przybędzie ich wystarczająco, gdy dodam obsługę kilku klientów na raz.

    @btw: Wrzuciłem to do kilku działów, bo w regulaminie nie widziałem zmianek, że tak nie można, a nie byłem właściwie pewien który najlepiej pasuje. Jeśli coś przeoczyłem to przepraszam. Adminów/modów prosiłbym o zaoszczędzenie tych kilku kliknięć i nie zbanowanie, jeśli temat tu nie pasuje to po prostu go wywalcie
    Ostatnio edytowane przez Deathplanter : 05-23-2007 - 21:33

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

    Domyślnie

    Gerenalnie odzew moda juz byl jeden watek wystarczy, cross-posting nie jest nam potrzebny...

    To z czym masz problem to blokujace I/O - mozna to rozwiazac elegancko za pomoca SELECT'a z timeout'em. Wtedy np jak masz otwarte 5 uchwytow i timeout na 200 ustawiony to co sekunde kazdy uchwyt bedzie obsluzony jak trzeba. Nie pisalem tego nigdy w C/C++ ale w Perl'u dzialalo ladnie i nie blokowalo wejscia. Program generalnie odczytywal dowolna ilosc logow - to byl taki 'pozeracz logow', ktory reagowal na zdarzenia i wykonywal operacje - od przycinania lacze, przez ustawianie regul firewall'a po kontrataki wlacznie

    Zaraz poszukam kodu i podrzuce interesujacy Cie fragment - jesli tylko znajde, bo ten prosty IPS napisalem w 2001 roku Moze znajde jeszcze u ktoregos kumpla na serwerku...

    P.S.
    Ten prosty IPS mial nawet funkcje okresowego auto-update'u - tak jak w programach antywirusowych - sprawdzal sam czy sa nowe regulki i ladowal je w locie. Calosc napisana w Perl'u.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  3. #3
    Deathplanter jest offline Online since sixteen
    Zarejestrowany
    May 2007
    Postów
    3

    Domyślnie

    Cytat Napisał tqm Zobacz post
    mozna to rozwiazac elegancko za pomoca SELECT'a z timeout'em. Wtedy np jak masz otwarte 5 uchwytow i timeout na 200 ustawiony to co sekunde kazdy uchwyt bedzie obsluzony jak trzeba
    A co jeśli nastąpi timeout? Uchwyt zostaje zamykany? U mnie algorytm powinien wyglądać tak: jeśli są dane do wczytania, niech je wczyta, przeparsuje dane i przejdzie do czasu jałowego. Jak właściwie działa odczyt na socketach? Czy bufor z danymi napełniany jest przez kernel, czy to recv dopiero te dane odbiera? Jestem, jeśli chodzi o te sprawy całkowitym newbie i to mój pierwszy app, gdzie faktycznie muszę prawidłowo zadbać o IO. Byłbym wdzięczny za jakiś sample code

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

    Domyślnie

    Moje archiwa z kodem sa w Polsce... kod dziala jeszcze na 2 serwerach i probuje namierzyc wlasnie kumpli aby mi go odeslali :-/

    Generalnie socket czy plik nie mialo dla mnie znaczenia - to uchwyt pliku bedzie w Perlu wiec robisz tablice z uchwytami, krecisz licznikiem lazac po tablicy i sprawdzasz po kolei, czy dany uchwyt ma jakies dane czekajace na obsluge.

    Jesli danych nie ma w ciagu powiedzmy 0.2sek to zwiekszasz licznik (nastepny element tablicy = nastepny uchwyt pliku) i jeszcze raz to samo... Jak dane sa to je czytasz do konca. Jak sie skoncza (EOT a nie EOF) to znowu licznik++... no i wypada jeszcze resetowac licznik aby nie wyjsc poza tablice

    Dzialalo to doskonale! Postaram sie znalezc ten kod jakos - moze to potrwac nieco... Jak go dorwe to wrzuce tutaj ta petelke... tylko ze to bedzie Perl nie C/C++
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  5. #5
    Deathplanter jest offline Online since sixteen
    Zarejestrowany
    May 2007
    Postów
    3

    Domyślnie

    I jak Ci szukanie idzie? d;

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

    Domyślnie

    Kod sie znalazl w najstarszej wersji jaka wypuscilem
    Szkoda nieco... sam mialem ochote pojsc na skroty z innym projektem

    Cos mniej wiecej takiego mam w innej aplikacji zrobione i wlasnie testuje:

    Kod:
    use POSIX;
    use IO::Socket;
    use IO::Select;
    use Socket;
    use Fcntl;
    
    # Listen to port.
    $server = IO::Socket::INET->new(LocalPort => $port,
                                    Listen    => 10 )
      or die "Can't make server socket: [email protected]\n";
    nonblock($server);
    
    $select = IO::Select->new($server);
    
    ##### sporo kodu
    sub nonblock {
        my $socket = shift;
        my $flags;
    
        $flags = fcntl($socket, F_GETFL, 0)
                or die "Can't get flags for socket: $!\n";
        fcntl($socket, F_SETFL, $flags | O_NONBLOCK)
                or die "Can't make socket nonblocking: $!\n";
    }
    pozniej kazde polaczenie jakie przychodzi do serwera jest akceptowane, ustawiane w tryb nie-blokujacy i dodawane do kolejki uchwytow po ktorych smiga $select... Jak uchwyt zawiera jakies dane to 'podnosi reke' i jest obslugiwany...

    Kod:
    # anything to read or accept?
    foreach $client ($select->can_read(1)) {
       # obsluga polaczenia
    }
    Jak na razie testuje, wiec nie wypowiem sie co do wydajnosci i stabilnosci, tym bardziej gdybys chcial takie cos implementowac w C/C++.

    Moze jakis framework ktos poleci... Jesli nie masz na prawde dobrego powodu by wymyslac kolo od nowa, to po prostu go nie wymyslaj... wez gotowe
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

Podobne wątki

  1. Będą się gryść??
    By przemek12345 in forum Wirusy/Konie trojańskie
    Odpowiedzi: 3
    Autor: 04-06-2007, 19:11
  2. Kto pomoże się zemścić ?
    By krystse in forum Hacking
    Odpowiedzi: 7
    Autor: 04-02-2007, 17:20
  3. co się dzieje???
    By markossx in forum Off Topic
    Odpowiedzi: 4
    Autor: 03-28-2007, 21:09
  4. Udało mi się!!!!!!!!!!!!:))))))))))))
    By fedor in forum Linux
    Odpowiedzi: 4
    Autor: 01-15-2007, 21:51
  5. co się stało z cracking.pl?
    By hunter in forum Off Topic
    Odpowiedzi: 1
    Autor: 12-26-2006, 10:08

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