Laden...

Forenbeiträge von die_pest Ingesamt 22 Beiträge

10.03.2017 - 19:12 Uhr

Hallo PhaseV,

für deine Idee eines lokalen Netzwerkchats solltest du zunächst beachten, dass jeder Rechner, der diesen Chat benutzt sowohl Server als auch Client ist. Das heißt alle Informationen an allen Rechnern, über vorhandene Nutzer des Chats usw., müssen überall gleich sein! Um das umzusetzen musst du dir, wie bereits vorgeschlagen, zunächst eine Methode (Multicast oder Broadcast) aussuchen, damit die Nutzer des Chats alle Informationen untereinander austauschen können. Wenn du eine Methode gefunden hast, schaust du, ob du Infos senden und von allen anderen, die das Programm verwenden, empfangen kannst. Dann nimmst du die empfangenen Informationen und speicherst sie am besten in einer dafür angelegeten Klasse z.B. "Contact", die so aussehen könnte:


public class Contact
{
private string Nick;
private IPAddress IP;
private string Status;
...

// Constructor
public Contact(string nick, IPAddress ip, string status)
{
   this.Nick = nick;
   this.IP = ip;
   this. Status = status;
...
}


// Getter und Setter

public iP
{
   get{return this.IP;}
   set{this.IP = value;}
}
.
.
.

}


Und dann zb als globale Liste :

 public static List<Contact> contacts = new List<Constact>()

LG die_pest

10.03.2017 - 18:49 Uhr

Hallo,

du hast recht. Es hat sich in den Code ein Fehler geschlichen.
Statt "so" sollte da eigentlich "s" stehen und in readMessage werden die Informationen mit s.Data ausgelesen.

                try
                {
                    // End Reading the recieved data.
                    s.Recieved = listener.EndReceive(result);

                    // Recieve more data.
                    listener.BeginReceive(data, 0, data.Length, SocketFlags.None, RecieveCallback,    newState);

                    readMessage(s);
                }
                catch { }

LG

09.03.2017 - 16:37 Uhr

Hi,
ja stimmt die Reichenfolge von EndRecieve und BeginRecieve war auch mein erster Gedanke, deshalb habe ich es auch so versucht:


                try
                {
                    // End Reading the recieved data.
                    so.Recieved = listener.EndReceive(result);

                    // Recieve more data.
                    listener.BeginReceive(data, 0, data.Length, SocketFlags.None, RecieveCallback,    newState);

                    readMessage(so);
                }
                catch { }

Das hatte jedoch das gleiche Resultat zu Folge. Hat jemand noch eine andere Idee?

LG

09.03.2017 - 13:02 Uhr

Hallo,

für ein aktuelles Projekt nutze ich RAW Sockets um eingehenden und ausgehenden Datenverkehr eines Netzweradapters zu erfassen. Das ist recht einfach und funktioniert auch gut. Allerdings kommt es immer wieder vor, dass Pakete doppelt erkannt werden. Wird also beispielsweise ein UDP Paket über den Adapter abgeschickt, werden beim RAW Socket 2 Pakete empfangen. Wenn man dann die Header ausliest hat man 2 fast identische Pakete, nur dass das eine Paket vollständig ist und beim 2. Paket die Checksumme immer 0 ist.

Hier der Code den ich verwende:


            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
            listener.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
            listener.ExclusiveAddressUse = false;

            // Bind the socket to the local network interface.
            IPEndPoint endpoint = new IPEndPoint(localIP, 0);
            listener.Bind(endpoint);

            byte[] inVal = new byte[4] { 1, 0, 0, 0 };
            byte[] outVal = new byte[4];

            listener.IOControl(IOControlCode.ReceiveAll, inVal, outVal);

            // The data buffer;
            byte[] data = new byte[4096];

            State s = new State();
            s.Socket = listener;
            s.Data = data;

            listener.BeginReceive(data, 0, data.Length, SocketFlags.None, RecieveCallback, s);
        }

        private void RecieveCallback(IAsyncResult result)
        {
            State s = result.AsyncState as State;
            Socket listener = s.Socket;
            EndPoint ep = new IPEndPoint(IPAddress.Any, 0);

            // Go on waiting for data.
            byte[] data = new byte[4096];
            State newState = new State();
            newState.Socket = listener;
            newState.Data = data;

                try
                {
                    // Recieve more data.
                    listener.BeginReceive(data, 0, data.Length, SocketFlags.None, RecieveCallback,    newState);

                    // End Reading the recieved data.
                    so.Recieved = listener.EndReceive(result);

                    readMessage(so);
                }
                catch { }
            }
        }    


Ich kann mir vorstellen, dass das irgendwas mit dem asynchronen Empfangen am Raw Socket zu tun hat. Kann mir irgend jemand sagen, woher dieser Fehler kommt?

LG die_pest

03.03.2017 - 14:57 Uhr

Vielen Dank für eure Antworten, das hat mir sehr geholfen.
Allerdings habe ich zusätzlich noch eine Möglichkeit gefunden.
Man kann über Raw Sockets alle eingehenden und ausgehenden IP Pakete abfangen und damit weiterarbeiten.

LG

28.02.2017 - 19:37 Uhr

Hallo,

ich bin auf der Suche nach einer Möglichkeit beliebeige UDP Pakete abzufangen und an eine von mir bestimmte Adresse und Port weiterzuleiten. Dabei können die Pakete von einem anderen Programm innerhalb meines Rechners kommen, oder über das Netzwerk (verschiedene Adapter und IPs) per Broadcast Nachricht.

Ein Beispiel:

Ein Programm innerhalb meines Rechners schickt eine Broadcast Nachricht ins Netzwerk mit Sende- und Empfangsport 46000 und Zieladresse 255.255.255.255. Jetzt will ich dieses Paket in einem anderen Programm auf dem selben Rechner auslesen und verarbeiten. Das klappt auch mit dem folgenden Code:


Socket Listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, (ProtocolType.Udp));

            Listener.ExclusiveAddressUse = false;
            Listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            
            // Ip Adresse meines Netzweradapters
            IPEndPoint endpoint = new IPEndPoint(localIP, 46000);
            Listener.Bind(endpoint);

            byte[] data = new byte[1024];
            EndPoint p = (EndPoint)(new IPEndPoint(IPAddress.Any,0));

            Listener.BeginReceiveFrom(data,0,data.Length, SocketFlags.None, ref p, Callback, Listener);

Das Problem:
Ich müsste alle Pakete abfangen, die von meinem Rechner oder vom Netzwerk kommen, aber auf einem beliebigen Port und nicht nur auf Port 46000.

Gibt es eine Mögluichkeit das umzusetzten?

LG die_pest

29.02.2016 - 15:42 Uhr

Hi,
danke für die Antwort.
Kannst du mir kurz ein Codebeispiel geben, wie du das mit der Property meinst?

Und bezüglich lock ist es so, dass Typen wie int nicht unterstützt werden, sondern anscheinend nur Objektvariaben. Also am besten immer selbst definierte private Objekte.

lg

29.02.2016 - 15:24 Uhr

Hallo,

ich suche nach einer Möglichkeit Variablen aus statischen Klasse thread safe auszulesen und zu setzen. Ich verwende in meinen Klassen getter und setter und greife nicht direkt auf die Variablen zu.
Ich habe habe bis jetzt einige Möglichkeiten gefunden, wie Lock, Monitor, Mutex.., mit denen man Codeabschnitte sichern kann. Wenn ich nun sowas nutze, um die Variablen thread safe zu verwenden, bräuchte ich jedoch für jede Variable einen eigenes locker Objekt, an dem die Threads warten. Ich habe jedoch sehr viele Variablen, es wäre also ein extremer Aufwand für jede Variable ein Objekt bereitzustellen. Weiterhin habe ich das Schlüsselwort volatile gefunden, dass wohl dem Compiler anzeigen soll, dass mehrere Threads auf die Variable zugreifen. Jedoch übernimmt es wohl von sich aus keine Synchronisation oder? Eine andere Möglichkeit ist wohl die Klasse Interlocked zu verwenden. Jedoch unterstützden die Methoden nur Referenzen auf Variablen. Jedoch gibt c# bei einem return Aufruf im Getter keine Referenz zurück und man sollte die Variabeln ja nicht mit public von außen zugreifbar machen. Hat jemand einen guten Vorschlag wie man sowas effizient umsetzen kann?

Das ist ein kleine Codebeispiel:

static class Test
    {
        private static volatile int x = 0;
        private static volatile int y = 0;


        public static int X
        {
            get
            {
                return x;
            }

            set
            {
                x = value;
            }
        }

        public static int Y
        {
            get
            {
                return y;
            }

            set
            {
                y = value;
            }
        }

    }

 private static void run()
        {
            // Funktioniert nicht, da Test.X nicht referenzierbar
            Interlocked.Increment(ref Test.X);
            Console.WriteLine("Task:" + Task.CurrentId + " X= " + Test.X);
        }

Run() wird von mehreren Tasks ausgeführt.

Danke im Voraus

Lg

01.05.2014 - 17:59 Uhr

Hallo Leute,

ich bin auf der Suche nach einer Möglichkeit ein Programm in C# zu schreiben, mit dem ich über ein Faxgerät (HP Officejet 6500) Faxe verschicken kann. Es gibt ein änliches Programm von HP mit dem man das machen kann, aber das ist unzuverlässig uns stürzt dauernd ab.
Brauche ich für die Umsetzung vll auch noch extra Hardware wie ein modem oder so?
Danke im Vorraus für die Hilfe.
Lg

16.03.2012 - 12:27 Uhr

hi,

erstmal danke für sie antwort!
ich benutze udp in meinem Programm obwohl ich auch igmp verwenden würde...

lg

15.03.2012 - 22:06 Uhr

Hallo,

ich habe mich in der letzten zeit häufiger mit multicast nachrichten beschäftigt.
dabei ist mir aufgefallen, dass man sich in einer gruppe anmelden muss um daten empfangen zu können! Dafür hab ich ein kleines Beispielprogramm geschrieben, das auch wunderbar funktioniert... allerdings habe ich dann noch nach einer möglichkeit gesucht das an und abmelden in dieser gruppe zu überwachen und habe leider keinen weg gefunden! nun meine frage:

gibt es eine möglichkeit sich automatisch benachrichtigen zu lassen wenn jemand einer multicast gruppe beitritt oder sie verlässt?

schonmal danke für die hilfe
lg die_pest

06.12.2011 - 15:07 Uhr

hallo,

nein es kommt keine fehlermeldung!
aber nach dem ich einen try catch gesetzt habe stürzt das programm auch nicht mehr ab??!!
aber hast du eine erklärung dafür warum manchmal nicht alle bytes ankommen die gesendet wurden?
könnte es daran liegen dass man beginSend verwenden muss wenn man beginReceive verwendet?

lg ie_pest

06.12.2011 - 14:12 Uhr

Hallo,

hab ein Problem mit Socket.BeginReceive, denn jedes mal wenn ich in der Callback Methode Socket.EndReceive(result) aufrufe, beendet sich mein komplettes Programm!!
hier ist noch mein code:
hab auch noch einen extra thread in callback gesetzt um den absturz zu verhindern, hat aber auch nix gberacht

und wenn ich die synchronen methoden send() und receive() nehme bekommt der Empänger nicht immer alle Daten die geschickt wurden...wie kann das sein?

        
public void Server_starten()
        {

            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(new IPEndPoint(IPAddress.Any, 6000));
            listener.Listen(1000);
            listener.BeginAccept(new AsyncCallback(Callback), listener);
            
        }

        public void Callback(IAsyncResult result)
        {
            Socket listener = (Socket)result.AsyncState;
            Socket client = listener.EndAccept(result);
            
            listener.BeginAccept(new AsyncCallback(Callback), listener);
            Thread th = new Thread(new ParameterizedThreadStart(nachricht_empfangen));
            th.IsBackground = true;
            th.Start(client);
        }

        public void nachricht_empfangen(object c)
        {
            try
            {
                Socket client = c as Socket;
                byte[] buffer = new byte[1024 * 100];
                string client_ip = ((IPEndPoint)client.RemoteEndPoint).Address.ToString();
                string nachricht = "";
                string n = "";
                string id = "";

                client.BeginReceive(buffer, 0 , buffer.Length, SocketFlags.None,empfangenCallback,client);
}

        private void empfangenCallback(IAsyncResult result)
        {
            Socket client = result as Socket;
            int i = client.EndReceive(result);
        }

vielen dank im vorraus

lg die_pest

30.06.2011 - 15:59 Uhr

Hallo,

ich bin auf der Suche nach einer Möglichkeit die Zugriffsrechte der Gastdruppe an meinem Computer mit c# code zu ändern. Dies benötige ich, da die berechtigungen für Named pipes im netzwerk so weit ich weiß über einen Gast-Account laufen.
dh mann müsste für jeden Computer, der eine Pipe aufmacht, damit ein anderer Computer im Netzwerk darauf zugreifen kann, erst in den Sicherheitsrichtlinien des Server- Computers festlegen, dass ein Gast Account über das Netzwerk zugreifen kann.
Bei manchen System wie win7 home oder win xp home gibt es aber die möglichkeit nicht die sicherheitsrichtlinien zu ändern.
Also wenn jemand eine Möglichkeit kenn und vll meine Ausführungen verstanden hat...
bitte melden

mfg die_pest

15.06.2011 - 17:55 Uhr

hallo,

als ich heute mein Programm angeschaut habe ist mir aufgefallen, dass in dem Source Code von Monotorrent vorallem im DHT Ordner mehr Klassen definiert sind als die auf die ich zugreifen kann, wenn ich die vorher kompilierte MonoTorrent.Dht.dll verwende.
Nun meine Frage: Kann es sein das beim Kompilieren, also erstellen der dlls nicht alle klassen übergeben werden?? Und wenn ja, kann man etwas dagegen tun um auf alle funktionen zugreifen zu können?

hier der Link zum Source Code: https://github.com/mono/monotorrent

Schonmal danke im vorraus!

Lg die_pest

14.06.2011 - 00:13 Uhr

Hallo Leute,

bei Monotorrent gibt es eine Möglichkeit nur mit dem Infohash über dht einen Torrent zu erstellen und mit diesem dann die ursprüngliche Datei herunterzuladen.
Allderdings bleib ich immer im MetadataMode des Torrentmanager hängen, ohne dass etwas passiert! Es gibt auch keine Fehlermeldung. Er findet einfach keine Peers, obwohl ich mir sicher bin, dass auf dem anderen Computer der TorrentManager im Seeding Zustand ist!

Hier der Code der aus dem Infohash den Torrentmanager machen soll:

 
            int port = 1000;      
            
            engine.ChangeListenEndpoint(new IPEndPoint(IPAddress.Any, port));
            DhtListener dhtListner = new DhtListener(new IPEndPoint(IPAddress.Any, port +1));
            DhtEngine dht = new DhtEngine(dhtListner);
            engine.RegisterDht(dht);         
            dhtListner.Start();
            engine.DhtEngine.Start();
            TorrentSettings s = new TorrentSettings(10, 150, 0, 0);
            MonoTorrent.RawTrackerTiers tiers  = new MonoTorrent.RawTrackerTiers();
            TorrentManager manager = new TorrentManager(ih, downloadsPath, s, torrentsPath,tiers);
            engine.Register(manager);
            manager.Start();
            manager.GetPeers();

            while (manager.State == TorrentState.Metadata)
            { }
            ListViewItem item = new ListViewItem(manager.Torrent.Name);
            item.SubItems.Add(manager.Torrent.Size.ToString());
            listView2.Items.Add(item);

Vielleicht hat jemand eine Ahnung was falsch läuft oder ob ich etwas vergessen habe!
Würde mich sehr über ein wenig hilfe freuen.

Mfg die_pest

09.06.2011 - 18:30 Uhr

hey leute,

sry dass ich nochmal so blöd nachfragen muss, aber ich schaff es immernoch nicht den code unter win 7 zum laufen zu bringen!

Vielleicht versteh ich auch einfach die anleitung zur lösung nicht richtig!
Man soll ja die r17 herunterladen und in win7 compilieren...aber ich find bei der verlinkung und überall anders auf der seite keine Datei die man dazu runterladen kann!
und wenn ich mir den code anschaue dann ist das eine änderung in der "zerconfigService.csproj" Projekt datei?!

also was muss man genau tun?

lg die_pest

30.05.2011 - 02:17 Uhr

Hi,

vielen dank für deine Antwort!
Ich krieg jetzt zumindest mal die neuste dll zum laufen!
Allerdings funktiobniert der Service Browser bei win 7 immernoch nicht... 🙁

Fehlermeldung:
DNSServiceException:
"An error accured in the function DNSServiceBrowse: -65563"

Vielleicht fällt dir da ja auch irgendetwas kluges zu ein...hoff 😉

lg die_pest

30.05.2011 - 00:17 Uhr

Hallo,

du hast recht ich hab die Fehlermeldung weggelassen weil das auf der Seite behandelt wird!
Allerdings hatte ich auch nur eine andere gefunden, die etwas älter war und wo die Lösung noch nicht behandelt wurde!
Auf jeden Fall mal danke für die Seite, aber ich hab auch das Problem das auf der Seite beschrieben wird!

Und zwar eine: BadImageFormatException

wenn ich den code auf win 7 64 bit mit der neusten ZeroconfigService.dll ausführe!

Jetzt steht auf der Seite auch die Lösung zu diesem Problem, allerdings kann ich weder die Einstellungen vornehmen die die Lösung bringen sollen, noch verstehe ich was man bei apple runterladen kann um das Problem zu lösen!

Ist mit "Official .NET COM object for 32 bit and 64 bit .NET compilation" das neuste Bonjour SDK gemeint??

Vielen Dank im Vorraus

29.05.2011 - 22:44 Uhr

Hallo,

ich verwende seit einiger Zeit die Zeroconfig Net Services auf einem Win xp 32 bit System. Jetzt wollte ich das Programm auch auf einem Win 7 64 bit System zum laufen bringen. Allerdings bekomme ich immer eine Fehlermeldung wenn ich nach einem anderen Service im Netzwerk suche. Habe auch schon jede Menge gegoogelt um eine Lösung für das besagte Problem zu finden, allerdings gibt es keine konkreten.

Hier der Link zur Google code page:

zeroconfignetservices

Vielleicht kann mir jemand hier helfen!
Schonmal danke im vorraus

lg die_pest

06.01.2010 - 21:17 Uhr

danke für den tipp!
lg die_pest

05.01.2010 - 14:59 Uhr

hi leute,

da ich komplett neu hier im forum bin, wollte ich mal hallo sagen und gleich meine erste frage loswerden!

ich würde gern bonjour von apple in C# einbinden...leider find ich nur extrem wenig beispielcode wie das funktionieren könnte!

grund: alle computer im netzwerk finden, die mit meinem pc verbunden sind, und die ip adressen von diesen abfragen! Ich hab gehört das soll damit ganz gut gehen!?

also wenn jemand ne gute seite kennt oder sich sonst irgendwie damit auskennt...bitte melden!

danke im vorraus
lg die_pest