eXec.plMAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA
MAGAZYN UŻYTKOWNIKÓW KOMPUTERÓW AMIGA

piątek, 17. sierpnia, 2018, 23:27

Dodano: 2009-09-21, Autor: Grzegorz Zdaniuk, Kategoria: AmigaOS, Liczba wyświetleń: 263

A A A

Omówienie problemu z komendą AddNetInterface

Do napisania tego artykułu zachęciła mnie dyskusja prowadzona na amigaworld.net z czynnym udziałem autora Roadshow gdzie próbowano zgłębić omówiony tu problem.

AmigaOS 4.x posiada zintegrowaną obsługę stosu TCP/IP o nazwie RoadShow. Kluczowym poleceniem jest tutaj AddNetInterface, który uruchamia połączenie sieciowe. Polecenie to wywołane w sekwencji startowej sprawia, że oczekiwanie na przyznanie adresu IP przez serwer DHCP zatrzymuje start systemu. Na eXecu było to o tym powiedziane m.in. przy okazji opisu 4 aktualizacji pre-release AmigaOS4. Dlatego jestem przekonany, że każdy czytelnik eXeca (a w szczególności użytkownicy najnowszej wersji systemu) doskonale o tym wie. We wspomnianym opisie był prosty sposób na poradzenie sobie z opóźnieniem poprzez dodanie do linijki uruchamiającej AddNetInterface polecenia "Run >NIL:". Niestety taki zabieg ma też swoje minusy. System startuje nie czekając na nadanie adresu IP, w związku z czym jeżeli uruchomimy przeglądarkę zaraz po załadowaniu systemu przekonamy się, że nie mamy dostępu do sieci. Trzeba odczekać kilka sekund do uzyskania IP. Sprawa jest jeszcze gorsza gdy mamy jakieś programy sieciowe uruchamiane w sekwencji startowej - np. smbfs montujący dyski sieciowe udostępniane przez inne komputery. Programy te, w takim przypadku, również odmówią współpracy. Dlatego też Hyperion nie zdecydował się na dodanie "Run >NIL:" do omawianego polecenia. Za cenę chwilowego zatrzymania startu systemu uzyskujemy adres IP i przede wszystkim pewność, że kolejno uruchamiane programy będą miały dostęp do sieci.

Jednak dla Amigowców przyzwyczajonych do błyskawicznego startu systemu te kilka sekund opóźnienia to niemal wieczność, dlatego wielu postanowiło uporać się z tym problemem na własną rękę.

Najprostszym, ale jednocześnie zalecanym w instrukcji do AmigaOS sposobem jest po prostu nadanie komputerowi stałego adresu IP. W ten sposób uniknie się oczekiwania na odpowiedź serwera DHCP. Jednak czasem nadanie stałego adresu nie jest możliwe. Przykładem może być sytuacja gdy regionalne władze postanawiają zrobić prezent mieszkańcom w postaci powszechnie dostępnego na danym terenie, bezpłatnego, bezprzewodowego internetu. Taka sieć jest najczęściej w najstarszej technologii 802.11b i nie posiada żadnych zabezpieczeń w rodzaju WEP czy WPA. Jest więc wręcz stworzona dla Amigi. W tym przypadku jednak nieodzowne jest ustawienie komputera w oczekiwanie na adres IP przydzielony przez serwer DHCP dostawcy usług internetowych. Aby jakoś zaradzić problemowi opóźnień startu systemu, a jednocześnie nie narażać się na problem "zbyt wczesnego" uruchamiania przeglądarki, proponuję rozwiązanie w postaci prostego skryptu, który będzie nas informował o stanie połączenia, nie zatrzymując startu systemu.

Pierwsze co należy zrobić to usunąć (lub przynajmniej poprzedzić średnikiem) linijkę uruchamiającą AddNetInterface w startup-sequence. Następnie w to miejsce wpisujemy polecenie wywołujące nasz skrypt. Może ono wyglądać np. tak:

Run >NIL: C:Execute S:net

Teraz przystępujemy do tworzenia skryptu o nazwie "net", który będzie się znajdował w katalogu S. W dowolnym edytorze wpisujemy:

SetEnv NET "Łączenie..."
C:AddNetInterface QUIET DEVS:NetInterfaces/~(#?.info)
SetEnv NET "Połączony"

belka łączenie

Powyższy, krótki skrypt tworzy zmienną środowiskową NET, która początkowo przyjmuje wartość "Łączenie...", następnie uruchamia AddNetInterface. Gdy komenda zakończy pracę, zmienna przyjmuje wartość "Połączony". Oczywiście wszystko dzieje się w tle i nie zatrzymuje sekwencji startowej. Stały podgląd na naszą zmienną możemy mieć na pasku tytułowym Workbencha. W preferencjach Workbench dodajemy ją poprzez wpisanie "%e NET". Ja opisałem ją w następujący sposób "Sieć: %e NET".

belka połączony

Status "Połączony" zobaczymy za każdym razem ,gdy AddNetInterface zakończy pracę. Nie koniecznie oznacza to połączenie z internetem. Przy braku uzyskania adresu IP (np. w przypadku gdy kabel sieciowy jest odłączony) polecenie kończy pracę po jakiejś półtorej minuty. Należy więc udoskonalić nasz skrypt, tak abyśmy wiedzieli czy próba połączenia zakończyła się sukcesem czy nie. W tym celu można wykorzystać komendę GetNetStatus. Zatem udoskonalony skrypt może wyglądać następująco:

SetEnv NET "Łączenie..."
C:AddNetInterface QUIET DEVS:NetInterfaces/~(#?.info)
C:GetNetStatus CHECK INTERFACES,RESOLVER,DEFAULTROUTE
if warn
SetEnv NET "Błąd sieci"
else
SetEnv NET "Połączony"
endif

Dzięki temu, gdy nie uda się uzyskać połączenia np. serwer DHCP nie odpowiada lub po prostu kabel sieciowy jest odłączony nasza zmienna przyjmie wartość "Błąd sieci". Taki komunikat zobaczymy na górnej belce Workbencha.

belka błąd sieci

Aby informację o braku połączenia uczynić bardziej widoczną, do informacji na tytułowej belce można jeszcze dodać informacyjny requester, używając komendy RequestChoice. Po linijce SetEnv NET "Błąd sieci" należałoby wówczas dodać np.

C:RequestChoice "Połączenie sieciowe" "Wystąpił błąd sieci. *nPrzerwano próby połączenia." "Zrozumiałem"

requester błąd sieci

Pierwszy człon to tytuł komunikatu, kolejny to treść (*n oznacza rozpoczęcie następnej linii), a ostatni to treść przycisku.

Do tego skryptu warto przenieść wszelkie komendy związane z siecią, które znajdują się w startup-sequence, czy też user-startup. Przykładowo, jeżeli używamy sieci wifi, to polecenie SetPrism2Defaults (które musi być przed AddNetInterface) też należy tutaj umieścić. Podobnie, gdy montujemy dyski sieciowe używając smbfs czy też każdorazowo przy starcie systemu synchronizujemy zegar systemowy (przy pomocy komend Date i SetClock). Te komendy powinny się znaleźć po linijce SetEnv NET "Połączony".

Ostatecznie mój skrypt wygląda następująco:

SetEnv NET "Łączenie..."
C:SetPrism2Defaults SSID FreeINTERNET
C:AddNetInterface QUIET DEVS:NetInterfaces/~(#?.info)
C:GetNetStatus CHECK INTERFACES,RESOLVER,DEFAULTROUTE
if warn
SetEnv NET "Błąd sieci"
C:RequestChoice "Połączenie sieciowe" "Wystąpił błąd sieci. *nPrzerwano próby połączenia." "Zrozumiałem"
else
SetEnv NET "Połączony"
C:Date SERVER PREFS
C:SetClock SAVE
endif

Oczywiście nie jest to sposób doskonały. Podstawową wadą przedstawionej metody jest to, że jest ona wykonywana tylko raz, podczas startu systemu. Oznacza to, że jeżeli po uzyskaniu połączenia zostanie np. odłączony kabel sieciowy to w dalszym ciągu będzie widniał status "Połączony". Tak więc nie jest to sposób na wszelkie możliwe problemy z siecią a jedynie skrypt informujący o otrzymaniu lub braku nadania adresu IP przez serwer DHCP po uruchomieniu komputera.

Mam nadzieję, że ten prosty sposób "ułatwi życie" użytkownikom najnowszej wersji AmigaOS, a także zachęci do eksperymentowania z nowymi komendami, które znalazły się w najnowszej odsłonie naszego systemu.

Grzegorz Zdaniuk
zobacz inne nasze artykuły »



AmigaOS.pl

Polecamy
Najpopularniejsze
eXec blog

Świat poza Amigą: