Cześć
Chcę napisać router w C#, lecz kompletnie, ale to kompletnie nie mam pojęcia jak się do tego zabrać, dlatego proszę o jakieś wskazówki jak podejść do tematu. Nie chodzi mi tu o gotowe rozwiązania bo to jest zbyt szerokie zagadnienie. Głównie bym was prosił o podanie zagadnień, kierunków, w których mam się poruszać. Fajnie by było jak by ktoś mi podpowiedział jak dobrać się do karty sieciowej, jak przechwycić pakiety itp.
Jak chcesz napisać warstwę sprzętową?
Chyba, że masz na myśli soft do rutera jakiejś firmy
Mam na myśli soft na PC. Wkładam do PCta kilka kart sieciowych i na nich routuje. Tylko zostaje mały szczegół żeby napisać program co będzie mi to robił :)
Najpierw poczytaj moze o tym jak odbywa sie samo rutowanie, skoro nie wiesz jak sie zabrac. Hasla przydatne w temacie - protokoly routingu (np. RIP, RIP2, chociaz mozna tez poszalec z OSPF :) ), warstwy modelu ISO/OSI. Jesli chcesz miec bezposredni dostep do sieciowki tak, by filtrowac pakiety to musisz a) napisac sterownik b) wykorzystac np. biblioteke WinPcap.
Protokoły routingu znam w miarę dobrze, a jak czegoś nie wiem to zawsze są RFC. Z tym nie będzie problemu. Problemem jest to, że nie programowałem nigdy w C# i go nie znam. Poczytałem trochę na temat, ale C# znam od strony teoretycznej i to <ort>na razie </ort>pobieżnie (składnia języka).
Może jednak lepiej będzie jak postawie konkretne problemy:
-
Na początek chciałbym pobrać kilka segmentów TCP i rozdzielić je na nagłówki i pakiety IP i wykonać podobną operacje już z samym pakietem IP. Po pobraniu sprawdzić sumy kontrolne. Czy w C# istnieją metody, które zrobią to za mnie, czy muszę rozdrabniać się do bitów i sam stworzyć metodę do składania bitów na pakiety i segmenty. Jeśli istnieją takie metody napiszcie mi coś o nich.
-
Jak pobieram dane to też wypadało by też coś odesłać. Jak wysłać w sieć wygenerowany segment TCP?
W ta strone to sie nie zaglebialem, ale mozesz zajrzec do przestrzeni System.Net albo System.Net.Sockets ale to chyba za plytko jak dla Ciebie. Wydaje mi sie, ze WinPcap jest lepszym wyjsciem.
A mogę tak głupio spytać, czy nie lepiej skorzystać z gotowych rozwiązań?
No, chyba, że to wszystko tak tylko dla sportu.
Bardziej dla sportu. Najlepiej uczyć się przez przykłady i powstałe w tym momencie problemy. Chwilowo jednak zarzucam projekt router. Muszę co nieco jeszcze poczytać o podstawach c# żeby brać się za ten problem.
A tak na marginesie to jak przypisać liczbę ósemkową do zmiennej. Przy liczbach szesnastkowych język zachowuje się według moich oczekiwać, ale przy ósemkowych niestety nie. Jak robię tak:
int zm = 011; (chcę zapisać ósemkową wartość 11)
to do zmiennej przypisuje mi 11 dziesiętnie, a przykładowo w c++ w zm było zapisane 9 dziesiętnie czyli 11 ósemkowo.
O ile z szesnastkowymi nie ma problemu, to ósemkową można np. tak:
int zm = Convert.ToInt32("11", 8);
Dzięki za podpowiedź.
Mam następny kłopot. Chodzi o bitowe kodowanie liczb ujemnych przez .NET. Czy net koduje ujemne wartości w U2, czy w innym systemie. Najlepiej jak pokażę na przykładzie z założeniem, że jest to U2.
- zapisuję taką wartość do zmiennej -2147483648 czyli bitowo 11111111 11111111 11111111 11111111(U2)
- wykonuję na zmiennej następującą czynność
zmienna << 1;
czyli zmienna ma teraz wartość
11111111 11111111 11111111 11111110, co w U2 jest równe -2 dziesiętnie.
Niestety jak wykonam następujące polecenieConsole.WriteLine("{0}",zmienna);
to program wypisuje mi 0 a nie -2. Czego tak się dzieje?
</i>
Co się tyczy wcześniejszego posta to zmienna ta jest typu int
Rozgryzłem.
mój błąd -2147483648 =
10000000 00000000 00000000 00000000(U2) a nie
11111111 11111111 11111111 11111111(U2)
Jak tam Twój projekt router? Są jakieś postępy? Ja chcę stworzyć generator pakietów , np TCP/IP i próbuje coś kombinować z winPcap`em. Jak rozwiązałeś problem z routerem, jakieś wskazówki, uwagi ?