2012-04-12 13 views
5

Chciałbym napisać program i uruchomić go na dwóch komputerach oraz wysłać dane z jednego komputera do drugiego w ramce Ethernet.Czy mogę napisać programy sieciowe oparte na sieci Ethernet w C++?

Zwykle dane aplikacji znajdują się w warstwie 7 modelu OSI, czy istnieje coś takiego jak ograniczenie jądra lub ograniczenie interfejsu API, które uniemożliwiłoby mi napisanie programu, w którym można określić docelowy adres MAC i mieć pewne dane wysłane do ten MAC jako ładunek Ethernet? Następnie napisz program do nasłuchiwania przychodzących ramek i chwyć klatki z określonego źródłowego adresu MAC, wyodrębniając ładunek danych z ramki?

(Więc nie chcę żadnych innych kosztów, takich jak nagłówki IP lub TCP/UDP, nie chcę iść wyżej niż warstwa 2).

Czy można to zrobić w C++, czy też cała komunikacja musi odbywać się w warstwie IP i czy można to zrobić w systemie Ubuntu? Dodatkowa miłość do wskazywania lub dostarczania przykładów! : D

Mój problem jest oczywiście jestem nowy do programowania sieciowego w języku C++ i o ile mi wiadomo, jeśli chcę komunikować się przez sieć, muszę użyć połączenia socket() lub podobnego, który działa w warstwie IP , więc czy mogę napisać program C++ do pracy na warstwie 2 OSI, czy istnieją w tym celu interfejsy API, czy jądro Linux pozwala na to?

+1

C++ to język programowania, warstwa IP to abstrakcyjna koncepcja. W jaki sposób jeden zastępujący drugiego w tekście jest poza mną. – littleadv

+5

@littleadv: Dlaczego? Nie wie dokładnie, o co pytać ("Jak używać surowych gniazd w C++?"), Ale doskonale rozumiesz znaczenie. – cha0site

+3

Teoretycznie nie powinno być problemów z C++, które spadną do 2, ale obsługa systemu operacyjnego może Cię ograniczyć. Choć UDP ma bardzo mało narzutów, po prostu użyj tego. –

Odpowiedz

7

Jak już wspomniano gniazd, prawdopodobnie po prostu chcesz użyć gniazda surowe. Może ta pomocna jest page with C example code.


W przypadku szukasz pomysłu na program tylko z wykorzystaniem sieci Ethernet, a jednocześnie jest użyteczna:

Wake on LAN w to oryginalna forma jest dość prosta. Zauważ jednak, że większość aktualnych implementacji faktycznie wysyła pakiety UDP (wykorzystując to, że odbiornik nie analizuje nagłówków pakietów itp., Ale tylko ciąg w pakiecie ładunku).


Używanie gniazd surowych jest zwykle ograniczone do użytkowników uprzywilejowanych. Być może trzeba albo

  • nazwać swój program jako root
  • lub mieć to root i SETUID ustawić
  • lub ustawić zdolność do tworzenia surowej gniazdo korzystając setcap CAP_NET_RAW+ep /path/to/your/program-file

ostatniej opcja daje więcej drobniejszych uprawnień (tylko surowe gniazda, nie zapisuj dostępu do całego systemu plików itp.) niż dwa pozostałe. Jest jednak jeszcze mniej znany, ponieważ jest "tylko" obsługiwany z jądra 2.6.24 na (który przyszedł z Ubuntu 8.04).

+0

Dziękujemy za dane wejściowe i łącza do przykładów kodu. To wyjaśniło mi wiele rzeczy :) – jwbensley

+0

Cieszę się, że mogłem pomóc :) – zpea

Powiązane problemy