Laden...

Forenbeiträge von Franknstein Ingesamt 529 Beiträge

19.08.2005 - 20:12 Uhr

Warum ist dir klar, dass Udp schneller sein muss?
Udp hat nur keine Fehlerkorrektur die kaputte Packete nachfordert. Wenn bei Udp ein Packet gehimmelt ist, wird es halt verworfen. Von der Geschwindigkeit ist TCP und UDP annähernd gleichschnell. Allerdings kann es passieren, dass die Daten mittels TCP langsamer übertragen werden, wenn Packete fehlen. Bei UDP verschwinden diese Packete wie gesagt aber. Weiterhin merkst du niemals bei UDP ob die Gegenseite die Packete entgegenommen hat, oder ob sie weg sind.

--
mfg
Franknstein

17.08.2005 - 22:24 Uhr

Er blockt meines Wissens nur, wenn er auf neue Connections wartet. Und wenn das Programm halt beendet wird muss eben eine Threadabortexception geworfen werden um dann eine Socketexception im Thread auszulösen.

Ich hoffe das ist das, was du gemeint hast. Wenn nicht, dann erläutere bitte genauer was du damit sagen willst....

--
mfg
Frankenstein

16.08.2005 - 22:46 Uhr

Es ist zwar bei diesem Beispiel nicht der Fall, da es sich um eine Konsolenapplikation handelt, aber bei mir bekommt jeder Socket einen eigenen Thread. Der TCPListener ist nichts anderes als ein Socket, und wird daher auch in einem eigenen Thread ausgeführt.

16.08.2005 - 16:34 Uhr

Ok, sowas ist natürlich sehr schön. Danke für den Tipp!

Allerdings fällt mir noch ein Punkt d ein:
Du könntest in die Connection- und Client-Klasse noch Events für
-Verbindung hergstellt
-Verbindung geschlossen
-Daten gesendet
-Daten empfangen
-...
einbauen. Damit kannst du einfach andere Aktionen ausführen, wenn etwas passiert ist...

16.08.2005 - 12:20 Uhr

Hast du das mit den Beispiel gemacht, das hinter den Links Client oder Server in deinem ersten Beitrag angeführt ist?

Wenn ja, dann wundert mich das nämlich nicht, da das Warten auf neue Verbindungen und das Warten auf Packete die zu empfangen sind, den derzeitigen Thread so lange blockieren, bis neue Daten zum empfangen oder neuen Verbindungen da sind:
Ich würde das so machen:

Client:


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace NetworkTest
{
    class Client
    {
        private Socket m_Socket = null;
        private NetworkStream m_Stream = null;
        private Thread m_Thread = null;
        public Client()
        {
            this.m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            this.m_Thread = new Thread(new ThreadStart(this.Recceive));
        }

        public void Open()
        {
            this.m_Socket.Connect(Dns.GetHostEntry("localhost").AddressList, 13000);
            this.m_Stream = new NetworkStream(this.m_Socket);
            this.m_Thread.Start();
        }

        public void Close()
        {
            this.m_Thread.Abort();
            this.m_Stream.Close();
            this.m_Socket.Close();
        }

        public void Send(string msg)
        {
            try
            {
                byte[] buf = Encoding.Default.GetBytes(msg);
                this.m_Stream.Write(buf, 0, buf.Length);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

        private void Recceive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[10240];
                    this.m_Stream.Read(buffer, 0, buffer.Length);
                    string msg = Encoding.Default.GetString(buffer).TrimEnd((char) 0x00);
                    Console.WriteLine(msg);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message); 
                Console.WriteLine(e.StackTrace);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Client cli = new Client();
            cli.Open();
            cli.Send("Meldung vom Clienten");
        }
    }
}

Server:


namespace Server
{
    class Connection
    {
        private Thread m_Thread = null;
        private Socket m_Socket = null;
        private NetworkStream m_Stream = null;

        public Connection(Socket s)
        {
            this.m_Socket = s;
            this.m_Stream = new NetworkStream(s);
            this.m_Thread = new Thread(new ThreadStart(this.Recceive));
            this.m_Thread.Start();
        }

        private void Recceive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[10240];
                    this.m_Stream.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(System.Text.Encoding.Default.GetString(buffer).TrimEnd((char) 0x00));
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

        public void Send(string msg)
        {
            try
            {
                byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
                lock (this.m_Stream)
                {
                    this.m_Stream.Write(buffer, 0, buffer.Length);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }

        public void Close()
        {
            try
            {
                this.m_Thread.Abort();
                this.m_Stream.Close();
                this.m_Socket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
    }

    class TCPServer
    {
        TcpListener m_Listener = null;
        Thread m_Thread = null;
        List<Connection> m_Connections = null;

        public TCPServer()
        {
            this.m_Listener = new TcpListener(IPAddress.Any, 13000);
            this.m_Thread = new Thread(new ThreadStart(this.Run));
            this.m_Connections = new List<Connection>();
        }

        public void Start()
        {
            this.m_Listener.Start();
            this.m_Thread.Start();
        }

        public void Stop()
        {
            this.m_Thread.Abort();
            this.m_Listener.Stop();
        }

        private void Run()
        {
            try
            {
                while (true)
                {
                    Socket s = this.m_Listener.AcceptSocket();
                    Connection conn = new Connection(s);
                    this.m_Connections.Add(conn);
                    conn.Send("Hallo vom Server");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            TCPServer svr = new TCPServer();
            svr.Start();
        }
    }
}

Es gibt nur einige Punkte zu beachten:
a) Ich würde anstatt der List<Connection> eine eigene Listen-Klasse verwenden, die Möglichkeiten bietet, per IP-Addresse auf die Verbindung zuzugreifen.
b) Das ganze ist mit der Beta von VS2005 gemacht. Evtl musst du etwas verändern um es mit dem 2003er zu verwenden.
c) Du musst immer die SocketExceptions abfangen und dann die Verbindung trennen.
Nämlich immer wenn ein Socket geschlossen wird, wird auf der Gegenseite eine Socketexception fliegen... (Hauptsächlich in der Methode die auf neue Daten wartet, kann aber auch bei der Senden-Funktion passieren)

Hoffe es hilft dir weiter!

26.07.2005 - 23:03 Uhr

Hallo,

Wenn ich ein Windows-Forms-Programm habe, in dem mehrere Threads existieren, dann muss ich, wenn ich von einem fremden Thread auf die WinForm-Methoden zugreifen will, dies über Winform.BeginInvoke tuen.

Allerdings ist mein Problem, dass ich keine Winform sondern eigene Klassen "synkronisieren" müsste. Daher würde es mich interessieren, wie man so etwas in seine eigenen Klassen implementiert. (Also das die Klasse eine BeginInvoke-Methode bereit stellt, mit der ich eine Funktion der Klasseninstanz in dem Thread ausführen kann, in dem auch die Klasse instanziiert wurde, obwohl ich die Funktion aus einem anderen Thread heraus aufrufe....)

Ich hoffe ich habe mich verständlich genug ausgedrückt.....

mfg
Franknstein

16.07.2005 - 23:34 Uhr

Ich würde zwar schon asyncrone Methoden benutzen, aber es sein lassen, den Threadpool zu verwenden. Nimmst du eigentlich Sockets oder so TCPClients?
Übrigens gilt es nicht, dass es dich nervt.

15.07.2005 - 23:27 Uhr

Das ist zwar nicht die Lösung, aber ich würde keinen Threadpool verwenden.
Ein Threadpool kann nur 25 Threads verwalten und wird auch von Framework verwendet. Wenn du ihn also ewig blockierst, verhinderst du, dass andere Klassen die den Pool auch nutzen , diesen sofort verwenden können. Verwalte doch mal deine Threads selbst!

Außerdem würde ich die Datei nicht in einem Rutsch übertragen, sondern in vielen kleinen Stücken. Wenn dann nämlich mal ein Bruchstück nicht übertragen werden konnte, kannst du ja dafür sorgen, es erneut zu senden.

Deinen Source habe ich mir aber aus Zeitmagel nicht angesehen.

PS:
Wenn man die Asynronen Funktionen verwendet, wird dann automatisch dies ein einem neuen Thread ausgeführt? (Also die zu tätigende Aktion wie das übertragen?)

04.07.2005 - 21:05 Uhr

Du kannst dazu eine neue Klasse erzeugen, die von der Socket oder Streamklasse erbt. Dann musst du nur noch die Methoden zum Lesen und Schreiben überschreiben und die übertragenen Bytes mitzählen. Dann weißt du genau, wie viel du übertragen hast. Oder du summierst auf eine Int64-Variable auf, wie viele Bytes du gesendet hast. Weiterhin kann du ja noch in einer Zweiten Variablen speichern, wie viele Bytes empfangen wurden.

Übrigens rate ich von dem Tutorial ab, da alle Beispiele synkron sind. Mache lieber das ganze mit AsyncCallbacks (hier).

Wenn das ganze mit Threads auf Packete wartet hat man zwar den Vorteil, dass der Quelltext leichter Verständlich ist, und man nicht so viel Programmieraufwand hat, aber wenn man das ganze mit AsyncCallbacks macht, muss man sich nicht um die Timeouts von Clients kümmern. Wenn dann nämlich jemand bei Threads die Gegenseite per Taskmanager von Windows beendet, bekommt der Socket das nicht mit und es kann passieren, dass der Thread ewig auf Daten wartet wenn man sich nicht um sein Ableben kümmert(Ich kenne das nur zu Gut! Es ging einmal sogar so weit, dass das Programm sich selbst per Process.Kill() beenden musste, weil in irgent einer Lib, auf die ich keinen Zugriff hatte, ein Thread nicht beenden wollte, wenn das Programm beendet wurde und vorher die Gegenseite sich nicht abgemeldet hat. Den Fehler zu suchen war nicht lustig. Ich habe ihn dann nach einer ewigen Zeitspanne durch Zufall entdeckt!). Wenn man aber statt dessen die AsyncCallbacks verwendet, dann kann man sich Sicher sein, dass nach der Zeit x eine SocketException fliegt. Daher würde ich auf alle Fälle die asyncr. Verbindungen bevorzugen.

16.06.2005 - 20:26 Uhr

Mein Problem ist folgendes:


using System;
using System.Net.Sockets;

namespace Test
{
	public class CNetworkstream : NetworkStream
	{

	}
}

Und es kommt folgender Fehler beim Compilieren:
No Overload for Networkstream takes 0 arguments

16.06.2005 - 20:01 Uhr

Hallo,

Hallo ich habe eine Klasse die von einer anderen Klasse alle Methoden, Eigenschaften usw. erbt. Allerdings hat die Klasse von der ich erben will, keinen parameterlosen Konstruktor. Wie kann ich dennoch von dieser Klasse erben?

06.06.2005 - 22:41 Uhr

Wenn zu dem Zeitpunkt an dem ich DataAvailable aufrufe noch nichts angekommen ist, wird wie zu erwarten der AsyncCallback nicht ausgelöst. Das bedeutet, dass ich die Daten nie erhalte.

Ich frage mich nur, wie ich unterbinden kann, dass eine BeginRead-Methode einen neuen Thread startet, der ewig auf neue Daten wartet aber nicht abbricht, da keine Daten kommen. Ich könnte 30 sek lang alle Sekunden vor dem BeginRead warten, ob Daten kommen, aber das will ich auch nicht unbedingt. Daher hatte ich gehofft, eine andere Methode dafür genannt zu bekommen.

06.06.2005 - 21:38 Uhr

Hallo!

Wie kann ich einen Callback nach einer Timeoutzeit t abbrechen?
Also es geht um folgendes:
Ich habe einen TcpClient der einen NetworkStream n öffnet. Jetzt schicke ich eine Nachricht los und lasse den n mittels n.BeginRead(/.../) auf eine Antwort warten. Wie bekomme ich jetzt am besten mit, falls keine Antwort kommt? Gibt es dafür was halbwegs fertiges, oder muss ich das in einem neuen Thread tn starten und warten ob nach der Zeitspanne t noch keine Antwort gekommen ist?

--
Frank

02.06.2005 - 19:46 Uhr

Wie verifizierst du, dass du auch die richtigen Infos zurück bekommst? Bei mir kommen manchmal irgent welche falsch benannten Alben, wenn ich mittels Titel und Interpret suche. Lässt du den User aus mehreren Möglichkeiten auswählen?

01.06.2005 - 20:31 Uhr

Es gitbt eine Möglichkeit, an der ich so Hobbymäßig ein bisschen bastele. Allerdings braucht man dazu den Bandnamen und den Titel des Liedes. Man kann nämlich die Suchfunktion von freedb.org verwenden um erweiterte Infos zu bekommen. Allerdings muss man dafür Sorge tragen, dass die Titelinfos richtig geschrieben sind: http://www.freedb.org/freedb_search.php

Eine Klasse dafür habe ich noch nicht, aber die ist in Arbeit. Allerdings habe ich gerade wenig Zeit mich um die Entwicklung zu kümmern. Daher kann noch etwas Zeit bis zu Fertigstellung vergehen!

--
Frank

29.05.2005 - 21:25 Uhr

So schreibe ich das auch, allerdings lasse ich die If-Abfrage weg, da ich noch nie eine null übergeben bekommen habe!

29.05.2005 - 21:22 Uhr

Die Übertragung geht wegen der relativ flotten Internetanbindung rasend schnell, und wie viele Dateien es genau sind, kann ich derzeit noch nicht sagen! Ich weiß es leider nicht, darin liegt mein Problem!
Ich habe mich jetzt aber dazu entschlossen, die Verbindung neu aufzubauen, wenn sie getrennt wird.

29.05.2005 - 11:49 Uhr

Das mit dem UDP brauche ich vermutlich nicht, da es auf die 26 Byte(Sind es doch, oder?) pro Paket kaum ankommt.

Die Frage ist nur, ob ich eine persitente Verbindung verwende und halt alle 5 Minuten mal pingen sollte oder ob es sinnvoller ist, wenn ich die Verbindung kappe und neu aufbaue. Das Problem ist nämlich, dass Nachts, an Sonn- und Feiertagen nie Dateien versendet werden, aber dafür unter Tage manchmal (besonders am Samstag) extrem viele.

28.05.2005 - 20:26 Uhr

Hallo,
Ich habe seit langem auch mal wieder eine Frage:

Und zwar sollen zwischen einem Server und einem Client Dateien ausgetauscht werden. Das ist an sich ja überhaupt kein Problem, nur wie löst man trafficsparend das Problem, dass sich die Verbindung nach einiger Zeit kappt, wenn man auf den Socket nicht mehr zugreift(=Also keine Pakete schickt)? Soll ich am besten die IP des Clients beim Server speichern und nur immer dann eine Verbindung aufbauen, wenn wirklich Dateien zu übertragen sind, oder gibt es da andere Möglichkeiten?

--
Franknstein

25.12.2004 - 20:11 Uhr

Ebenfalls frohe Weihnachten von mir!
Ich habe einen Satz Holzbohrer aus HSS-Stahl 😁 (warum müssten Holzbohrer aus xCrVa sein?) und ein Hightech-Kofkissen sowie eine Stehlampe und etwas Geld bekommen.

14.12.2004 - 18:52 Uhr

Alternativ könnte man das mittels der Klasse Timespan lösen. Die kümmert sich selbsttätig um die Formatierung.

Edit:
Ich denke, dass die damit berechnete Zeit wirklich sehr schlecht ist. Die Brenngeschwindigkeit der meisten Brenner ist nämlich nicht konstant sondern beschleunigt nach außen hin. Daher kannst du zwei Sachen machen:
-Momentangeschwindigkeit bestimmen(anhand des Datendurchsatzes) und dann die Zeit berechnet, welche mit der Momentangeschwindigkeit benötigt wird
-Die Beschleunigung berechnen und dann mit der Beschleunigungsgleichung die Zeit t berechnen(und natürlich immermal die Beschleunigung neu berechnen...)

13.12.2004 - 23:08 Uhr

Ich habe hier eine kleine Wrapperklasse dazu mal gemacht. Vielleicht hilft diese dir weiter. Du musst lediglich den MysqlDriverCs installieren und in deinen Programmordner die MysqlDriverCs.dll reinkopieren und dazureferenzieren.


using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using IPlugIn;
using MySQLDriverCS;

namespace MySql
{
	/// <summary>
	/// Summary description for Class1.
	/// </summary>
	public class PlugIn : IDbase
	{	
		MySQLConnection connection = null;
		//private string ConnectionString = null;
		
		private string user, pass, server, database;
		public PlugIn()
		{
			//
			// TODO: Add constructor logic here
			//
		}
		
		/// <summary>
		/// Die Standartdatenbank welche zum Verbinden verwendet wird
		/// </summary>
		public string DefaultDatabase() 
		{
			return "mysql";
		}
	
		public void SetDbConnection(string user, string password, string server, string database)
		{
			this.user = user;
			this.pass = password;
			this.server = server;
			this.database = database;
		}

		public bool TestConnection(string user, string password, string server, string database)
		{
			MySQLConnection con = null;
			try
			{
				MySQLConnectionString mcs = new MySQLConnectionString(server, database,  user, password);
				con = new MySQLConnection(mcs.AsString);
				con.Open();
			}
			catch(Exception)
			{
				return false;
			}
			finally
			{
				con.Close();
			}
			return true;
		}

		public DataTable SelectQuery(string query, int FromRow, int RowsToSelect)
		{
			DataTable dt = null;
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand(string.Format("{0} LIMIT {1}, {2}",query, FromRow, RowsToSelect), this.connection);
				dt = this.ReaderToTable((MySQLDataReader) com.ExecuteReader());

				com.Dispose();
				return dt;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();

				if(dt != null)
					dt.Dispose();
			}
		}

		public object[] SelectRow(string query, int Row)
		{
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand(query, this.connection);
				MySQLDataReader dr = (MySQLDataReader) com.ExecuteReader();
				
				int k = 0;
				while(k < (Row-1))
				{
					dr.Read();
					k++;
				}
				
				object[] ret = null;

				if(dr.Read())
				{
					ret = new string[dr.FieldCount];
					for(int i = 0; i < dr.FieldCount; i++)
					{
						ret[i] = dr.GetValue(i);
					}
				}

				dr.Close();
				dr.Dispose();
				com.Dispose();

				return ret;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}
		
		public string[] GetDatabases()
		{
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand("SHOW DATABASES", this.connection);
				MySQLDataReader dr = (MySQLDataReader) com.ExecuteReader();
				
				ArrayList al = new ArrayList();
				while(dr.Read())
				{
					al.Add(dr.GetString(0));
				}
				
				string[] s = (string[]) al.ToArray(typeof(string));
				
				al.Clear();
				dr.Close();
				dr.Dispose();
				com.Dispose();
				return s;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public string[] GetTables()
		{
			try
			{
				string sql = string.Format("SHOW TABLES from {0}", this.database);
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				MySQLDataReader dr = (MySQLDataReader) com.ExecuteReader();
				
				ArrayList al = new ArrayList();
				while(dr.Read())
				{
					al.Add(dr.GetString(0));
				}

				string[] s = (string[]) al.ToArray(typeof(string));
				
				al.Clear();
				com.Dispose();
				dr.Close();
				dr.Dispose();

				return s;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public void ChangeDatabase(string DBName)
		{
			try
			{
				this.database = DBName;

				this.connection.Dispose();
				this.connection = null;

				return;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public int ExceuteNonSelect(string query)
		{
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand(query, this.connection);
				int result = com.ExecuteNonQuery();
				com.Dispose();
				return result;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public void CreateDatabase(string dbName)
		{
			try
			{
				string sql = string.Format("CREATE database {0}", dbName);
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				com.ExecuteNonQuery();
				com.Dispose();
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public void DropDatabase(string DbName)
		{
			try
			{
				string sql = string.Format("DROP DATABASE {0}", DbName);
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				com.ExecuteNonQuery();
				com.Dispose();

				if(this.connection.Database == DbName)
				{
					this.database = this.DefaultDatabase();
					this.connection.Dispose();
					this.connection = null;
				}
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
		}

		public DataTable GetDatabaseTableInfos(string dbName)
		{
			DataTable ret = null;
			try
			{
				string sql = string.Format("SHOW TABLE STATUS from {0}", dbName);
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				ret = this.ReaderToTable((MySQLDataReader) com.ExecuteReader());

				com.Dispose();
				return ret;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
			finally
			{
				this.Close();

				if(ret != null)
					ret.Dispose();
			}	
		}

		public void DropTable(string TableName)
		{
			string sql = string.Format("DROP TABLE `{0}`", TableName);
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				com.ExecuteNonQuery();

				com.Dispose();
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace + "	" + sql);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public int GetTableRowCount(string database, string table)
		{
			try
			{
				object[] row = this.SelectRow(string.Format("SELECT COUNT(*) from {0}.{1}", database, table), 0);
				return  Convert.ToInt32(row[0]);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message);
			}
		}

		public void Disconnect()
		{
			try
			{
				this.connection.BeginTransaction().Commit();
				this.connection.Dispose();
				this.connection = null;
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
		}

		public int GetTableCount(string DbName)
		{
			string sql = string.Format("SHOW TABLES from {0}", DbName);
			int count = 0;
			try
			{
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				MySQLDataReader dr = (MySQLDataReader) com.ExecuteReader();
				while(dr.Read())
				{
					count++;
				}
				dr.Close();
				dr.Dispose();
				com.Dispose();

				return count;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace + "	" + sql);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message +  "	" + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public string[] GetPrimaryKeyFromTable(string tablename, string databasename)
		{
			try
			{
				string sql = string.Format("EXPLAIN {0}.{1}", databasename, tablename);
				ArrayList al = new ArrayList();
				string[] result;
				
				this.Open();
				MySQLCommand com = new MySQLCommand(sql, this.connection);
				MySQLDataReader reader = (MySQLDataReader) com.ExecuteReader();

				while(reader.Read())
				{
					if(reader.GetString(3) == "PRI")
					{
						al.Add(reader.GetString(0));
					}
				}
				result = (string[]) al.ToArray(typeof(string));

				al.Clear();
				com.Dispose();
				reader.Close();
				reader.Dispose();

				return result;
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
			finally
			{
				this.Close();
			}
		}

		public void DoCreate(string Query)
		{
			try
			{
				this.Open();

				MySQLCommand com = new MySQLCommand(Query, this.connection);
				com.ExecuteNonQuery();

				this.Close();
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "		" + err.StackTrace);
			}
		}

		private void Open()
		{
			try
			{
				if(connection == null)
					connection = new MySQLConnection(new MySQLConnectionString(this.server, this.database, this.user, this.pass).AsString);
				
				this.connection.Open();
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
		}

		private void Close()
		{
			try
			{
				if(connection != null)
					connection.Close();
			}
			catch(MySQLException MErr)
			{
				throw new Exception(MErr.Message + "	" + MErr.StackTrace);
			}
			catch(Exception err)
			{
				throw new Exception(err.Message + "  " + err.StackTrace);
			}
		}

		private DataTable ReaderToTable(MySQLDataReader dr)
		{
			DataTable dt = new DataTable("Rows");

			while(dr.Read())
			{
				if(dt.Columns.Count == 0)
				{
					for(int i = 0; i <  dr.FieldCount; i++)
					{
						dt.Columns.Add(dr.GetName(i));
					}
				}
				DataRow row = dt.NewRow();
				for(int i = 0; i < dr.FieldCount; i++)
				{
					row[i] = dr.GetString(i);

				}
				dt.Rows.Add(row);
				row = null;
			}

			if(dt.Rows.Count == 0)
			{
				dt = dr.GetSchemaTable();
				dt.TableName = "Rows";
			}

			dr.Close();
			dr.Dispose();
			return dt;
		}
	}
}

02.12.2004 - 18:54 Uhr

Ich weiß es auch nicht, ich weiß nichtmal ob das so überhaupt geht. Sollte aber.

Du hast gesagt, mit recv wartest du auf eine Message(von Windows). Warum sendest du die dir nicht selbst, wenn du beenden willst?

02.12.2004 - 15:39 Uhr

mit send?

01.12.2004 - 22:14 Uhr

Sende ihm doch einfach eine Abbruchnachricht

28.11.2004 - 20:44 Uhr

Dazu gab es hier schonmal eine ausführliche Diskussion:
Programm unkaputtbar machen

27.11.2004 - 19:27 Uhr

Sie sind ein schlechter Mensch Herr Rodney....

Laut dem Trigonomen ist sin a = Höhe/Schrittweite(auf dich angepasst). Das formt man um sodass gilt:

cos a * Schrittweite = x
sin a * Schrittweite = y

Da dies aber nur so ist, wenn du vom Nullpunkt ausgehst, musst du noch die Koordinaten des Punktes aufaddieren von welchem aus du diesen weiteren Schritt gehen willst:

x = cos a * Schrittweite + x[alt]
y = cos a * Schrittweite + y[alt]

Den Code dazu wirst du selber hinbekommen

Edit:
Mist! cdr war schneller!

--
mfg
Franknstein

27.11.2004 - 13:33 Uhr

Ich habe das so gelöst, dass ich das IPlugin damals für das Projekt in eine andere Assembly ausgelagert habe. Diese wurde dann vom Pluginassembly sowie vom Hostprogramm implementiert. Des Weitern habe ich noch eine Statische Klasse im Host um das Plugin rumgebaut, sodass ich schön steuern kann welches Plugin ich laden will.

Aber falls du richtig viele Plugins mal brauchen solltest, ist das eine ganz schlechte Idee, denn du kannst Plugins nur laden und nicht entladen. Dazu gibts andere komplexere Möglichkeiten.

Franknstein

15.11.2004 - 17:15 Uhr

Hallo,

Ich habe noch nie in meinem Leben Viren per Email geschickt bekommen und Spam auch nur ganz selten. Aber heute habe ich gleich zwei Emails mit Viren als Attachment bekommen! Geht ein neuer Mailvirus um?

(Da muss ich gleich mal Win32Dasm anwerfen um zu gucken, was der Virus kaputt machen will!)

12.11.2004 - 16:55 Uhr

Meinst du das?

System.Text.Encoding.ASCII.GetBytes();

05.11.2004 - 11:04 Uhr

String.Format glaube ich so:

string.Format("{0:(#)}", (j+i*8+1)).ToString());

02.11.2004 - 20:09 Uhr

Manchmal....... egal, ich will mal nicht so sein

[php]
<?php
$name = 'Frank';
$data = 'Testdaten';
$pass = 'asdfa';

if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else
$ip = getenv("REMOTE_ADDR");

$fp = fsockopen($ip, 1111, $errno; $errstr); /der erste Parameter ist die
IP des PCs auf dem dein Prog
läuft, der zweite Parameter
ist der Port auf dem dein
Prog auf die Antwort wartet
/
if (!$fp)
{
die("Fehler beim Herstellen der Socketconnection");
}
else
{
fwrite($fp, sscanf('$name=%s\r\n', $name);
fwrite($fp, sscanf('$data=%s\r\n', $data);
fwrite($fp, sscanf('$pass=%s\r\n', $pass);
fclose($fp);
}
?>
[/php]

Um die Variablen zu erhalten, musst du nur auf Port 1111 einen TCP-Listener öffnen und warten bis das Script dir die Daten zuschickt nachdem du das Script aufgerufen hast. Aufrufen kannst du es ganz normal mit dem WebClienten

01.11.2004 - 22:00 Uhr

Warum? Er hat doch schon alles was er braucht... Aber er könnte noch seinenen C#-Code dazu posten. Dann währe das was für die FAQ

01.11.2004 - 11:22 Uhr

Wilst du dem C#-Prog Variablen übergeben und diese sollen nicht angezeigt werden, wenn jemand mit dem Browser auf diese Webseite geht?

Ist doch ganz leicht:
Du rufst mit deinem C#-Prog das PHP-Script so auf:
deinscript.php?x=1

Und dann macht das Script folgendes:
[php]
<?php
$config['name'] = 'Frank';
$config['year'] = '2004';
$config['month'] = '11';
$config['day'] = '1';

if($_GET['x'] == 1)
{
printf('--Deine Variablen können nun an das Prog übergeben werden.\r\n');
printf('--Aber du solltest die Daten so ausgeben:\r\n');
printf('--Key;Val\r\n');
printf('--=========================\r\n');
foreach($config as $key => $val)
{
printf('%s;%\r\n', $key, $val); /Dann kannst du sie schön mit deine Prog verarbeiten/
}
}
else
{
printf('Bitte besuchen Sie meine Webseite');
}
?>
[/php]

Edit:
Natürlich musst du in deinem Programm wenn du die Webseite aufrufst ?x=1 an die URL hängen, sonst wird das nichts....

01.11.2004 - 00:41 Uhr

Das ist zum Heulen... X(
Schreib zur Strafe 1000 mal:
"Ich darf auf Variablen die dem Script übergeben werden, nur mit $_GET['x'], $_POST['x'], $_COOKIE['x'] und $_SESSION['x'] zugreifen"

01.11.2004 - 00:32 Uhr

deinstring.Split('-')[1] für die eins
deinstring.Split('-')[2] für die 0499

oder falls du alle brauchst:


string[] tokens = deinstring.Split('-');

foreach(string s in tokens)
{
    Console.WriteLine(string.Format("{0} {1}",s, Environment.NewLine));
}

30.10.2004 - 14:53 Uhr

Original von VizOne

Original von Andy.C
wie entfernt mann denn ein bischen Quelltext !?

Strg-A, Entf 😁

MfG VizOne

Aber vorher noch in der der Konsole ILDASM /deinProg.exe eingegeben....

30.10.2004 - 14:46 Uhr

Von der Webcam oder von dem Bild das die Webcam liefert?

30.10.2004 - 12:24 Uhr

Ich kenne da eine effektivere Lösung:
Du nimmst eine Arraylist, und guckst mit der Methode Contains ob die Zufallszahl schon existiert. Wenn ja, fügst du die Zahl garnicht erst ein....

29.10.2004 - 14:36 Uhr

Ich denke, du musst eine Registrierung im Internet machen. Also ein PHP-Script, welches per WebClient geladen wird, bekommt ein paar Parameter übergeben, und überprüft anhand der Datenbank, wie oft diese Seriennummer schon verwendet wurde. Wenn jemand ein und die selbe Seriennummer 100 Mal verwendet, kannst du diese ja dann so sperren. Aber bedenke dabei zwei Dinge:
a) Es kostet dich Traffic, wenn dein Programm von vielen Leuten eingesetzt wird.
b) Der Server muss auch noch in n Jahren unter der Adresse erreichbar sein.(lässt sich relativ leicht lösen)
c) Du kannst Benutzer ausversehen bannen, die ein legale Version haben
d) Cracker entfernen ein bisschen Quelltext und alles funktioniert einwandfrei(bei denen).

27.10.2004 - 17:51 Uhr

Du kannst herausfinden welche Datenbanken existeren, wenn du nachfolgenden SQL absetzt:
SHOW DATABASES;

Editieren: Funktioniert nicht sicher...

27.10.2004 - 17:42 Uhr

Mach dir eine neue Klasse. In diese kommen alle Varablen wie Userid und so. Natürlich machst du die Variablen statisch. Das funktioniert vielleicht schneller und würde auch unter Mono funzen......

23.10.2004 - 12:59 Uhr

Hm, kann mal jemand ein Beispiel posten wo der Quelltext mit dem Mozzi/Firefox nicht funktioniert? Bei mir klappt alles! Ich verwende den Mozilla V1.7 und den Proxomitron....
Überhaupt sieht die MSDN-Webseite fast genau so aus wie im IE....

23.10.2004 - 01:22 Uhr

Ich würde es lassen, denn ich hätte Angst, das irgentwo ein Bug vorhanden ist, und ich nach einem im Quelltext nicht vorhandenen Bug suche. Außerdem sehe ich keinen Grund, warum man das Projekt nicht konvertieren können sollte auf VS2005 wenn es erscheint.

22.10.2004 - 16:07 Uhr

Dem Enum einen Standartwert zuweisen funzt net? Kannst ja mal im Quelltext gucken, ob denn überhaupt dein neuer Wert eingearbeitet wird....

22.10.2004 - 16:05 Uhr

Soll das eine C-Dll sein?

21.10.2004 - 21:15 Uhr

Pack deine Werte in eine Hashtable und serialisiere diese denn:


private void Load()
{
        try
			{				
				BinaryFormatter bf = new BinaryFormatter();
				FileStream ht_reader = File.Open(WorkingDirectory + ValsPath, FileMode.Open);

				vals = (Hashtable) bf.Deserialize(ht_reader); //Die Hashtable

				ht_reader.Close();
			}
			catch(FileNotFoundException)
			{
				throw new Exception("Fehler: Kann die Konfigurationsdatei nicht finden");
			}
			catch(Exception err)
			{
				throw new Exception(err.Message);
			}
}

private void Save()
{
        try
			{
				BinaryFormatter bf = new BinaryFormatter();
				FileStream ht_writer = File.Create(WorkingDirectory + ValsPath);
				bf.Serialize(ht_writer, vals);
				
// ht_writer.Flush();
				ht_writer.Close();

				bf = null;
				ht_writer = null;
			}
			catch(Exception err)
			{
				throw new Exception(err.Message);
			}
}


20.10.2004 - 18:37 Uhr

Ich gehe mittlerweile soweit, dass ich behaupte, der Fehler liegt im Framework, denn ich habe das selbe Problem mit einer anderen Komponente(Magic Docking Control). Der Fehler tritt aber nur manchmal auf, und unter Windows2000 mit dem .netFx 1.0 funktionierte es. Da tritt der Fehler garnicht auf.