Benutzer:Moerdn/ Netzwerk Setup

Ein Einfaches Netzwerk Setup kann man sich ganz einfach mit dem Socket Modul implementieren. Um von dem Client Server Gedanken weg zu kommen, werde ich in der Terminologie die Begriffe Sender und Empfänger verwenden. Jeder Knoten im Netzwerk kann so Nachrichten empfangen, als auch senden und wird aus Geschwindigkeitsgründen über einen Verbindungslosen UDP Kanal kommunizieren.

Die Sender Klasse

Bearbeiten

Der Sender wird als Klasse implementiert und kann nach belieben erzeugt und gelöscht werden. Als Parameter kann eine Default Nachricht, der Port und die IP verwendet werden. Man sollte beachten, das auf Posix System Port Nummer > 1000 verwendet müssen, da die ersten 1000 für das Betriebssystem reserviert sind

# Beispiel 1.1. Die Sender Klasse.

import socket

class Sender(object):

    def __init__(self, msg="", port=1001, ip=""):
        
        if ip == "":
            self.ip = socket.gethostname() # An localhost
        else:
            self.ip = ip

        self.msg = msg
        self.port = port
        
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.connect((ip, self.port))
        
    def send(self, msg=""):
        if msg != "":
            self.msg = msg

        self.sock.send(self.msg)


#END 1.1.

Die Sender Klasse verwenden

Bearbeiten
# Beispiel 1.2. Die Sender Klasse verwenden.

from Sender import *

s = Sender("nachricht text", port=6666, ip="192.168.178.31")
s.send() # Default Nachricht verschicken
s.send("neue nachricht")

#END 1.2.

Die Reciever Klasse

Bearbeiten
# Beispiel 1.3. Die Reciever Klasse.

import socket

class Reciever(object):

    def __init__(self, port=6666, ip="192.168.178.31"):

        self.port = port
        self.ip = ip
        
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sock.bind((ip, port))
        self.sock.setblocking(0)

    def recieve(self, buf_size=1024):
        try:
            return self.sock.recvfrom(buf_size)
        except socket.error:
            return None

#END 1.3.


Die Reciever Klasse verwenden

Bearbeiten

Der Empfänger muss zunächst einmal erzeugt werden und wird als Property des GameObjects gespeichert. Danach wird nur noch die recieve() Methode aufgerufen und im Falle von erhaltenen Daten, können diese ausgewertet werden.

# Beispiel 1.4. Die Reciever Klasse.

from bge import logic as GL
import socket

from Sender import Sender

def main(con):
    own = con.owner

    if not 'rec' in own:
        rec = Reciever(6665)

    data = own['rec'].recieve()
    if data is not None:
        print(data)


#END 1.4.


Die eigene IP Adresse ermitteln

Bearbeiten

Unter Windows ist es sehr leicht die eigene IP Adresse zu ermitteln, unter Linux muss man dagegen etwas mehr Arbeit verrichten. Das folgende Code Fragment zeigt einen Weg, die Daten OS - unabhängig zu ermitteln.

# Beispiel 1.5. Die eigene IP Adresse ermitteln.

import os
import socket

class IPAdress():

    def __init__(self):
        self.ip = socket.gethostbyname(socket.gethostname())            
        
        if self.ip.startswith("127.") and os.name != "nt":
            
            interfaces = ["eth0","eth1","eth2","wlan0",
                          "wlan1","wifi0","ath0","ath1","ppp0"]

            for ifname in interfaces:
                try: 
                    self.ip = self.__get_interface_ip__(ifname)
                    break
                
                except IOError:
                    pass
                
    def __get_interface_ip__(self, ifname):
        
        import fcntl
        import struct

    	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    	return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 
                                            0x8915,  # SIOCGIFADDR 
                                            struct.pack('256s', ifname[:15])
                                            )[20:24])

    def getRange(self, start=0, end=255):

        addr = self.ip.split('.')
        addr_range = []

        for nbr in range(start, end+1):
            addr[-1] = str(int(nbr))
            addr_range.append('.'.join(addr))

        return addr_range

    def __str__(self):
        return self.ip


##
# Verwendung der IPAdress Klasse
#
ip = IPAdress()
print(str(ip))

#END 1.5.