mit raw-sockets netzwerkbrücke erstellen
-
Hallo
ich habe mit meinem netbook eine wlan-verbindung zum router, möchte aber auch mit meinem normalen pc ins internet. kabel legen geht nicht und der usb-wlan stick bekommt die station nicht
eigentlich ein idealer fall für eine netzwerkbrücke, jedoch kann mein netbook dies nicht, da windows starter edition.
jetzt dachte ich es müsste doch möglich sein mit raw-sockets diese netzwerkbrücke selber zu bauen, in dem ich alle packete vom pc an den router weiterleite und die antworten zum router wieder zurück zum pc leite. der pc würde also mein netbook als router sehen. um alle packete zu bekommen müsste man dafür raw-sockets nehmen.
soweit die theorie...#include <WinSock2.h> #include <MSTcpIP.h> #pragma comment(lib, "ws2_32.lib") const char *target = "169.254.185.69"; const char *router = "192.68.1.1"; const char *localaddr = "192.168.1.35"; int main() { WSADATA wsa; WSAStartup(MAKEWORD(1, 1), &wsa); SOCKET s = socket(AF_INET, SOCK_RAW, 0);//IPPROTO_IP); sockaddr_in local; local.sin_addr.S_un.S_addr = inet_addr(localaddr); local.sin_family = AF_INET; local.sin_port = 0; bind(s, (sockaddr *)&local, sizeof(local)); DWORD in; int j = 1; WSAIoctl(s, SIO_RCVALL, &j, sizeof(j), 0, 0, &in,0, 0); while (1) { char buffer[64 * 1024]; sockaddr_in from; int fromlen = sizeof(from); int size = recvfrom(s, buffer, sizeof(buffer), 0, (sockaddr *)&from, &fromlen); if (size > 20) // ip-header { if (from.sin_addr.S_un.S_addr == inet_addr(target)) { sockaddr_in to; to.sin_addr.S_un.S_addr = inet_addr(router); to.sin_family = AF_INET; to.sin_port = 0; sendto(s, buffer + 20, size - 20, 0, (sockaddr *)&to, sizeof(to)); } if (from.sin_addr.S_un.S_addr == inet_addr(router)) { sockaddr_in to; to.sin_addr.S_un.S_addr = inet_addr(target); to.sin_family = AF_INET; to.sin_port = 0; sendto(s, buffer + 20, size - 20, 0, (sockaddr *)&to, sizeof(to)); } } } closesocket(s); }
und soweit die umsetzung. so wie ich das verstanden habe, fängt er den ip-header beim recvfrom mit auf, sendto fügt aber noch einen hinzu, also muss ich den empfangenen rausnehmen.
das blöde ist nur, wie zu erwarten beim ersten versuch, funktioniert es nicht. bisher habe ich sockets nur auf udp/tcp-ebene genutzt, raw-sockets sind also neuland für mich.
mit freundlichen grüßen
fragezeichen