Homepage Wiki Forum Buy

Ad-hoc

Aus GNUBLIN

Ad-hoc

Es ist möglich am Gnublin ein Ad-hoc Netzwerk aufzubauen und anschließend sich mit diesem,z.B. mit einem Iphone zu verbinden.

Inhaltsverzeichnis

Vorbereitung

Webserver einrichten

Wie man einen Webserver einrichtet ist unter Webserver mit CGI beschrieben.


Wlan Stick anstecken

Ich habe den ASUS WL-167g V3 verwendet. Wie man diesen Stick zum laufen bekommt ist unter WLAN beschrieben.

Einrichten des udhcpd

Um überhaupt eine Verbindung herzustellen ist es nötig dem zu verbindenden client eine IP Adresse zu vergeben. Dies geschieht zum Beispiel mithilfe des udhcp daemons.

Die config Datei des udhcpd (/etc/udhcpd.config) sieht folgendermaßen aus.

start 192.168.2.2
end 192.168.2.100
opt lease 86400
opt subnet 255.255.255.0
option dns 192.168.2.1
interface wlan0
pidfile /var/run/udhcpd.wlan0.pid

Als Adresse für den DNS sollte die IP vom GNUBLIN angegeben werden.

Automatisches öffnen des Browsers nach einem Login

Soll sich der Webbrowser automatisch nach einen WLAN login öffnen. So sollte folgender DNS-Server verwendet werden.


#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>


#define PORT 53
#define BUFLEN 512

int main(){
char recvbuf[BUFLEN];
char sendbuf[BUFLEN];
struct sockaddr_in socket_me, socket_other;
int i, s,slen=sizeof(socket_other);
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
socket_me.sin_family = AF_INET;
socket_me.sin_port = htons(PORT);
socket_me.sin_addr.s_addr = INADDR_ANY;
if(bind(s, (struct sockaddr *) &socket_me, sizeof(socket_me))== -1)
puts("Fehler bei Bind");

while (1){
int rc = recvfrom(s, recvbuf, BUFLEN, 0, (struct sockaddr *) &socket_other, &slen);
if(rc == -1){
puts("recvfrom()");
}
//bauen des Antwortpacket
sendbuf[0]=recvbuf[0];
sendbuf[1]=recvbuf[1];
sendbuf[2]='\x81';
sendbuf[3]='\x80';
sendbuf[4]=recvbuf[4];
sendbuf[5]=recvbuf[5];
sendbuf[6]=recvbuf[4];
sendbuf[7]=recvbuf[5];
sendbuf[8]='\x00';
sendbuf[9]='\x00';
sendbuf[10]='\x00';
sendbuf[11]='\x00';
//transaction Nr
//Flags
//Questions and Answers Counts
int len = strlen(&recvbuf[12]);
memcpy(&sendbuf[12], &recvbuf[12],len+5);
len = 12 + len + 4;
sendbuf[len+1]='\xc0';
sendbuf[len+2]='\x0c';
sendbuf[len+3]='\x00';
sendbuf[len+4]='\x01';
sendbuf[len+5]='\x00';
sendbuf[len+6]='\x01';
sendbuf[len+7]='\x00';
sendbuf[len+8]='\x00';
sendbuf[len+9]='\x00';
sendbuf[len+10]='\x3c';
sendbuf[len+11]='\x00';
sendbuf[len+12]='\x04';

//Ip addresse
sendbuf[len+13]=192;
sendbuf[len+14]=168;
sendbuf[len+15]=2;
sendbuf[len+16]=1;

int sendbuflen = len + 16 + 1; //die länge des packetes
sendto(s, sendbuf, sendbuflen, 0, (struct sockaddr *) &socket_other, slen);
}
return 0;
}

Dieser Code wird auf GNUBLIN kompiliert.

Los gehts

Als erstes geben wir GNUBLIN eine IP Adresse:

ifconfig wlan0 192.168.2.1 up

Dann versetzten wir den WLAN Stick in den Ad-hoc Modus und geben ihm gleich eine essid:

iwconfig wlan0 mode ad-hoc essid GNUBLIN

Danach starten wir unser eigen kompiliertes Programm im Hintergrund.

./dns-serv &

Nun muss nur noch der udhcpd daemon gestartet werden.

udhcpd

Nun sollte der Webbrowser schon direkt nach dem WLAN login starten.


Hinweis

Android hat grundlegend Probleme damit, sich mit einem Access Point zu verbinden. Beim Iphone funktioniert der Login einwandfrei.

In anderen Sprachen