Zum Inhalt springen

Kadaj

Mitglieder
  • Gesamte Inhalte

    133
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Kadaj

  1. Ja, es handelt sich im ein anderes Fenster, in meinem Fall, ein Java-Programm. Vielleicht gibt es eine Lösung in C++ für das Problem? Sind Spiele-Bots nicht so programmiert? Oder müssen dort auch immer die betreffenden Fenster im Fokus sein? Ehrlich gesagt wundert es mich, dass es für sowas keine Möglichkeit in Java gibt.
  2. Hallo, ich hab mir ein Programm geschrieben, mit dem ich Tastendrücke in einer Schleife simuliere. Also in der Form: keySender.keyPress( KeyEvent.VK_6 ); Thread.sleep(500); keySender.keyRelease( KeyEvent.VK_6 ); Thread.sleep(1000); ..... [/PHP] Problem dabei ist nur, dass ich dabei immer das Fenster, für das es bestimmt ist, im Vordergrund haben muss. Gibt es eine Möglichkeit, diese Tastendrücke explizit an ein bestimmtes Fenster zu senden? Dann könnte ich nebenbei noch an anderen Sachen arbeiten. Gruß
  3. Jap, danke dir. bin auch nochmal unseren Skript durchgegangen. Ich hatte das völlig falsch verstanden aber nun hat es sich mir endlich erschlossen^^
  4. Hallochen, ich les grad das buch von Addison Wesley und verstehe nicht ganz wie Runnable funktioiert. Klar ist, warum es das gibt, weil es keine Mehrfachvererbung gibt, man aber trotzdem eine Klasse ableiten und als Thread laufen lassen möchte. Nun hat eine Runnable-Klasse doch aber nur die Aufgabe ihre run()-Funktion aufzurufen, wenn any.start() aufgerufen wird, oder nicht? Beispiel: class hauptklasse{ int a = 1; System.out.println("hauptklasse"); // wird das ausgegeben, wenn meinThread gestartet wird? } class meinThread extends hauptklasse implements Runnable{ run(){ System.out.println(a); } } [/PHP] Ich habe gelesen, dass beim start() von objekt vom typ meinThread gleich die run()-Methode aufgerufen wird. Was passiert aber mit dem ganzen code in meiner hauptklasse? ich könnte ja auch eine Klasse von thread ableiten. Dann hätte diese Klasse eine eigene run()-Methode und wenn ich eine weitere Klasse von dieser, von Thread abgeleiteten Klasse, ableite und diese dann Runnable implementieren soll ( was glaub ich blödsinn wäre, weil diese klasse ja schon ein thread wäre ), was würde dann beim Aufruf von start() geschehen? Dann hätte ich ja 2 run()-Methoden. Kann mir jemand erklären wie die Runnable-Schnittstelle richtig funktioniert und wann man sie einsetze sollte?
  5. Wie Recht du hast^^ Egal welchen Compiler ich nehme: "Prog - Debug" uses an invalid compiler. Probably the toolchain path within the compiler options is not setup correctly?! Skipping... Das passiert auch, wenn ich einfach ein neues Glut-Projekt unter codeblocks anlege und gleich einen c++-Compiler nehme. Nichtmal der Beispiel-Code lässt sich übersetzen. Ja, da hab mich mich auch erst gewundert. Ich hab eine BITMAP.cpp.C und eine BITMAP.C mit dem selben Inhalt, nur C-Code. Die Dateien hat mein Prof als Beispiel an uns weitergegeben, diese Konstellation hat bei ihm unter Visual Studio funktioniert. Leider habe ich keine Idee wie ich das unter CodeBlocks anstelle, oder ob das überhaupt funktionieren kann. Vielleicht such ich mir einfach ein anderes Beispiel zum Laden von Texturen.
  6. Verstehe, ich hatte aber auch schon versucht den Compiler zu ändern. Mit einem C++-Compiler hat es aber nicht mehr funktioniert. Muss ich also ein neues c++-Projekt erstellen, damit ich meine bitmap.h verwenden kann?
  7. Hallochen, ich programmiere eigentlich nur unter linux, aber ich muss für ein Projekt unter Windows arbeiten. Nun habe ich ein Problem beim Verwenden eigener Header-Dateien. Ich habe mir ein Projekt erstellt, unter "build options" -> "search directories" für Compiler und Linker jeweils den Pfad angegeben, in dem die beiden header bitmap.h und texture.h mit den zugehörigen .c files liegen und diese Dateien auch noch dem Projekt hinzugefügt. Ich hab mir einige Beschreibungen im Netz angesehen, bei mir scheint nichts davon zu funktionieren. Die Fehler beziehen sich dabei alle auf die bitmap.c ("was not declared in this scope" zu 90%) Ich verwende für das Projekt den GNU-gcc Compiler. Die bitmap.h wird von der texture.h inkludiert. Hier mal die bitmap.c #include "bitmap.h" void *LoadDIBitmap(char *filename, BITMAPINFO **info) /* BITMAPINFO kennt er schonmal nicht */ { // den Rest aus dem header auch nicht FILE *fp; /* Open file pointer */ void *bits; /* Bitmap pixel bits */ long bitsize, /* Size of bitmap */ infosize; /* Size of header information */ BITMAPFILEHEADER header; /* File header */ ... [/PHP] und die bitmap.h [PHP] #ifndef _BITMAP_H #define _BITMAP_H //File: Bitmap.h //Written by: Mark Bernard //on GameDev.net: Captain Jester //e-mail: mark.bernard@rogers.com //Please feel free to use and abuse this code as much //as you like. But, please give me some credit for //starting you off on the right track. // //The file Bitmap.cpp goes along with this file // #include <iostream> #include <cstdio> #include <string> using namespace std; const short BITMAP_MAGIC_NUMBER=19778; const int RGB_BYTE_SIZE=3; #pragma pack(push,bitmap_data,1) typedef struct tagRGBQuad { char rgbBlue; char rgbGreen; char rgbRed; char rgbReserved; } RGBQuad; typedef struct tagBitmapFileHeader { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BitmapFileHeader; typedef struct tagBitmapInfoHeader { unsigned int biSize; int biWidth; int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } BitmapInfoHeader; #pragma pack(pop,bitmap_data) class Bitmap { public: //variables RGBQuad *colours; char *data; bool loaded; int width,height; unsigned short bpp; string error; //methods Bitmap(void); Bitmap(char *); ~Bitmap(); bool loadBMP(char *); private: //variables BitmapFileHeader bmfh; BitmapInfoHeader bmih; int byteWidth; //the width in bytes of the image int padWidth; //the width in bytes of the added image unsigned int dataSize; //size of the data in the file //methods void reset(void); bool convert24(char *); //convert to 24bit RGB bottom up data bool convert8(char *); //convert to 24bit RGB bottom up data }; #endif //_BITMAP_H Also unter Linux ist das definitiv einfacher, einfach die header inkludieren und dem gcc alle .c-Dateien mitgeben ... Weiß jemand wo das Problem liegt?
  8. Ok, es lag daran, dass ich vergessen hab moveX und moveZ zu initialisieren. Immerhin rechne ich ja mit +=.
  9. Hallo, ich schreibe grade an einem openGL-Programm. Dazu gehören natürlich auch keyboard-Funktionen. Mit w bzw s bewege ich mich vorwärts und rückwärts in einem Raum. Dazu folgendes: float camspeed = 0.8,directionX,directionZ,moveX,moveZ; ... case 'w': //Richtungsvektor directionX = centerX-eyeX; directionZ = centerZ-eyeZ; //Einheitvektor berechnen moveX+=camspeed*directionX/( sqrt( (directionX*directionX) + (directionZ*directionZ) ) ); moveZ+=camspeed*directionZ/( sqrt( (directionX*directionX) + (directionZ*directionZ) ) ); printf("directionX: %f und directionZ: %f\n",directionX,directionZ); printf("moveX: %f und moveZ: %f\n",moveX,moveZ); eyeX += moveX; eyeZ += moveZ; centerX += moveX; centerZ += moveZ; gluLookAt(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,0,1,0); break; ... [/PHP] Das funktioniert auch wunderbar, nur ist mir aufgefallen, dass ich manchmal beim Drücken der w-Taste gewaltige Sprünge nach vorne mache und nichts mehr von meinen Objekten sehe. Daher hab ich mir mal ausgeben lassen, was in moveX und moveY steht, was einem Punkt mit dem Abstand 1 vom Koordinatenursprung entspricht, welche ich dann mit der Position der Kamera und mit dem Punkt, auf dem sie fokusiert ist, addiere. Ich habe das Programm nur einmal kompiliert und erhalte 2 verschiedene Ergebnisse, nachdem ich nur die w-Taste gedrückt habe: [code] [kadaj@atheros Computergrafik]$ ./figuren OpenGL Version: |4.3.0 NVIDIA 310.19| directionX: -0.500000 und directionZ: -3.500000 moveX: -0.113137 und moveZ: -0.791960 [kadaj@atheros Computergrafik]$ ./figuren OpenGL Version: |4.3.0 NVIDIA 310.19| directionX: -0.500000 und directionZ: -3.500000 moveX: -213190605925492478661477779111936.000000 und moveZ: -0.791960 [/code] Was ist denn hier passiert? oO Wie kann es sein, dass auf einmal totaler Murks rauskommt. Das Programm ist doch das selbe. Kann vielleicht jemand Abhilfe schaffen? Gruß
  10. Da hab ich wirklich nur mit einem Auge gelesen, bloß gut. Stimmt, hätte man auch selbst drauf kommen können. Danke für die Hilfe
  11. Danke euch beiden! Bei beiden Beispielen scheint die windows.h eine Rolle zu spielen; in dem einem im Beispiel und bei dem anderen als Lösungshinweis. Ich werd mich am Montag mal durchwühlen. Scheinbar muss ich auch c++ verwenden, mal sehen ob sich das nicht auch als C darstellen lässt. Gruß
  12. Hallo, ich beschäftige mich grade mit openGL. Wir sollen dafür unter Verwendung der glut.h einige Sache ausprobieren. Ich würde dabei gern auf Linux bleiben, was bei 3D-Objekten und Beleuchtung etc. auch kein Problem war. Allerdings verzweifle ich grade daran eine Bitmap zu laden und diese auf ein Objekt zu legen. Ich hab schon ne halbe Ewigkeit gegoogelt. Da ich absolut keine Idee habe, wie ich das machen könnte, wollte ich ein Beispiel zum testen kopieren und es dann anpassen. Ein Schachbrett ist nicht das Problem, dazu lade ich ja auch keine Bitmap, aber die Beispiele, die ich gefunden habe, beziehen sich entweder nur auf ein Schachbrett oder verwenden Bibliotheken, die es nur unter Windows gibt Ich bin doch nicht der erste, der ein C-Programm unter Linux schreiben will, welches eine Bitmap lädt und diese als Textur verwendet. Im OpenGL-Buch von Dave Shreiner steht auch nichts zum Laden von Bitmaps. Gibt es irgendein Buch oder Tutorial welches das Problem unter Linux beschreibt?
  13. Kann das passieren? Also bei mir funktioniert es sowohl mit Bildern als auch mit mp3-Dateien von einem Rechner zum anderen. Laut doc auf oracle.com: Vielleicht passiert das, wenn man im Laufe des Quellcodes diesem Array mal ein anderes zuweist mit "=", dann verändert sich nämlich auch dessen Größe. Anders könnte ich mir das nicht erklären Gruß
  14. Ja, das ist mir auch aufgefallen. Ich hatte mich anfangs gewundert, dass die Dateien viel größer sind, bis mir bei der Textdatei aufgefallen ist, dass noch Nullen am Ende stehen. Ich hab es dann so gelöst, dass mein Client und mein Server anhand der Dateigröße im ersten Paket einfach berechnen wie viele bytes sie einlesen müssen. Gut zu wissen, danke
  15. Seh ich denn beim debug was in der datei passiert? Ich weiß leider ohnehin nicht wie ich das unter fedora-eclipse mache :/ Jedenfalls hab ich Beispiel im Netz gefunden und mein Fehler ist hier: //while( fis.read( DataBytes ) != -1 ){} fis.read( DataBytes ); [/PHP] Ich dachte es wird immer nur ein byte beim Aufruf in das byte geschrieben und -1 wird zurückgegeben, wenn das byte-array voll ist. Aber das byte wird gleich vollgeschrieben und -1 wird zurückgegeben, wenn das Dateiende erreicht wurde. Das habe ich an der Stelle wohl damit verwechselt: [PHP] int c; while ((c = in.read()) != -1) { ... Jedenfalls wird die Kopie jetzt fehlerfrei kopiert.
  16. Hallo, ich versuche grade eine Datei stückchenweise in ein byte-array einzulesen und in eine andere Datei zu schreiben. Das funktioniert aber nur, wenn die Datei bis 1024 Byte groß ist, muss das Programm sie zerlegen, dann ist sie unbrauchbar. Hier der Code dazu: FileInputStream fis = new FileInputStream(args[2]); byte[] DataBytes = new byte[1024]; // Bytes für die Daten int PacketNum = 0, NumCounter=1; PacketNum = (int)filesize/1024; if( filesize%1024 != 0 ) PacketNum++; int Lastsize = (int)filesize%1024; FileOutputStream fos = new FileOutputStream("clienttest"); for(; NumCounter <= PacketNum;NumCounter++ ){ while( fis.read( DataBytes ) != -1 ){} if( NumCounter == PacketNum ) fos.write(DataBytes, 0, Lastsize); else fos.write(DataBytes); } [/PHP] Und so sieht der Inhalt der Datei aus, die ich zum testen angebe: [code] start Ich bin ein Text Das sind 1024 Byte Ich bin ein Text Das sind 2048 Byte und noch ein wenig... end [/code] Das ist die Kopie: [code] und noch ein wenig... end Das sind 2048 Byte und noch ein wenig... end Das sind 2048 Byte und noch ein wenig... end [/code] Ich kann mir absolut nicht erklären wie das zustande kommt. Hat jemand von euch einen Durchblick? Gruß
  17. Was für ne geniale Idee, da wäre ich bestimmt nie drauf gekommen :upps Danke Klotzkopp!
  18. Kann das überhaupt sein, wenn mein Client nur so viele Bytes in das StartByte schiebt, wie die Zeichenkette "Testdatei" benötigt? Hallo Klotzkopp! Ja, das ist von mir: public static byte[] TransferBytes(byte[] bytes, int start, int end){ int size = end-start+1; System.out.println("size: "+size); byte[] newByte = new byte[size]; for(int x=start, y = 0;x<=end;x++,y++){ newByte[y]=bytes[x]; } return newByte; } [/PHP] Ich hatte auch am Anfang überlegt ob ich da keinen Mist zusammengebraut habe. Deshalb habe ich ja beim Client kurz vor dem Abschicken nochmal das DatagramPacket so auseinander genommen, wie es dann der Server macht undzwar mit den selben Funktionen. Dort funktioniert es. Der Fehler tritt ja schon vor dem ersten Aufruf von TransferByte auf. getData() gibt mir aus meinem 21 Byte großen DatagramPacket ein Byte zurück, welches viel größer ist. Das versteh ich halt nicht. Beim Client habe ich das ja nochmal getestet, angefangen mit getData(). Ausgehend von der Größe meines neuen, aber zu großen Bytes liefert TransferByte schon das, was es soll. Das hier wolltest du noch: [code] Warte auf Verbindung von Client... Verbindung aufgebaut, Paketgröße:21 request.getOffset(): 0 Bytegröße: 270 [/code] Ich sehe grade: [PHP] DatagramPacket request = new DatagramPacket(new byte[270], 270); Daher kommen also die 270 Byte. Aber das Paket gibt doch zunächst 21 Byte als Größe an. Dass ich das weiß, hilft mir grade nicht wirklich weiter^^
  19. Morgen uenetz, ich hab den Teil beim Server mal so angepasst: System.out.println("Länge des Namen(9): "+namelen); name = TransferBytes(b, 0, namelen-250); // liefert genau "Testdatei" System.out.println("Name vor dem Thread: "+new String(name)); name = TransferBytes(b, 0, namelen-1); // liefert genau "Testdatei" System.out.println("Name in Hex vor dem Thread: "+toHex(new String(name))); [/PHP] Das hier ist die Ausgabe: [code] Warte auf Verbindung von Client... Verbindung aufgebaut, Paketgröße:21 Bytegröße: 270 Länge des Namen(9): 258 size: 9 Name vor dem Thread: Testdatei size: 258 Name in Hex vor dem Thread: 54657374646174656900000000000000000000efbfbd4e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 [/code] Hmm, das überrascht mich jetzt weniger. Dass es funktioniert, wenn ich 250 Byte abziehe ist klar. Immerhin ist ja auch mein Problem, dass der aus dem Paket, welches beim Erhalten noch 21 Byte groß ist, nach getData ein Byte-Array macht, welches 270 Byte groß ist oO. Die Nullen zwischen dem String und den Zahlen, die hier scheinbar mit ausgegeben werden, sollten aber stimmen, da die Dateigröße ( 0 ) als long gespeichert wurde. Doch warum ist mien Byte plötzlich so gigantisch groß? Gruß
  20. Ich muss schon wieder was loswerden :/ Es geht immernoch um meinen Client und meinen Server, die über UDP Pakete verschicken sollen. Mein Client erstellt das DatagramPacket ohne Probleme. Wenn ich den Dateinamen, den ich zum Test wieder in ein byte umwandle, die Länge des Namen berechne und ihn mir raushole und ausgeben lasse, dann bekomme ich "Testdatei" ausgegeben. So soll es sein. Nun schicke ich das Paket los ( nur auf localhost ) und mein Server bekommt es auch. Zunächst mal der nötige Code. Client: DatagramSocket clientsock = new DatagramSocket(); // UDP-Socket für Client int port = Integer.parseInt(args[1]); long filesize = new File( args[2] ).length() ; // Dateigröße in Bytes byte[] StartByte; // noch als Funktion auslagern byte[] buf=new byte[8]; for(int i=0;i<8;i++){ buf[i]=(byte) (filesize>>>(i<<3));// Little Endian } System.out.println("Filename-size : "+ filesize ); System.out.println("Größe für dessen byte : " + buf.length ); StartByte = CombineBytes(args[2].getBytes(), args[2].getBytes().length, buf); int crc = crc16( StartByte ); // crc-Wert holen byte[] crcbyte = intToByte(crc); StartByte = CombineBytes(StartByte, StartByte.length, crcbyte); /* ****** bytes und int für Antwortpakete ****** */ byte[] receiveStartData = new byte[8]; byte[] ServerPort = new byte[4]; byte[] ServerCrc = new byte[4]; int newPort; byte[] sendData = new byte[1024]; // bytes für Datenübertragung /* ******************************************** */ clientsock.setSoTimeout(timeout); // Paket erstellen DatagramPacket sendStartPaket = new DatagramPacket(StartByte,StartByte.length,IP,port ); DatagramPacket receiveStartPaket = new DatagramPacket(receiveStartData, receiveStartData.length); byte[] conbyte; conbyte = sendStartPaket.getData(); // noch rauswerfen, wen es läuft int namelen = conbyte.length-8-4; byte[] name = new byte[namelen]; // byte für Dateinamen anlegen name = TransferBytes(conbyte, 0, namelen-1); // Dateiname System.out.println("Name: "+new String(name)); [/PHP] Wichtiger ist aber der Server: [PHP] int port = Integer.parseInt(args[0]); try{ /* UDP-Socket erstellen */ DatagramSocket serversock = new DatagramSocket(port); //DatagramPacket request = new DatagramPacket(new byte[1024], 1024); DatagramPacket request = new DatagramPacket(new byte[270], 270); while(true){ try{ System.out.println("Warte auf Verbindung von Client..."); serversock.receive(request); System.out.println("Verbindung aufgebaut, Paketgröße:"+request.getLength() ); //*********************** byte[] b; b = request.getData(); System.out.println("Bytegröße: "+b.length); int namelen = b.length-8-4; byte[] name = new byte[namelen]; // byte für Dateinamen anlegen name = TransferBytes(b, 0, namelen-1); // Dateiname System.out.println("Name vor dem Thread: "+new String(name)); Das DatagramPacket, was ich bekomme ist identisch, mit dem, was ich beim Client habe. Trotzdem bekomme ich als Name, beim Verwenden des selben Codes für das Auslesen des Namen diese Ausgabe: "Testdatei�N". Und das verstehe ich nicht. Ich habe zumindest schon festgestellt, dass mein Paket, welches genau 21 Byte groß ist ( auch das DatagramPacket, was der Server erhält ) beim Aufruf von getData() auf einmal beim Server 258 Byte groß ist. java UDP_Server 3000 Warte auf Verbindung von Client... Verbindung aufgebaut, Paketgröße:21 Bytegröße: 270 size: 258 Name vor dem Thread: Testdatei�N Ich weiß nicht so richtig wo der Fehler liegt. Kann mich unter Umständen bitte jemand aufklären?^^ Gruß
  21. Achso meinst du das. Ich sende ein einziges Paket, bestehend aus einem byte, welches beispielsweise 1000 byte groß ist. DIe ersten 2 byte sind die Paketnummer, dann kommen Daten und die letzten 4 byte sind die crc-Prüfsumme. Ich hol mir also einfach die Prüfsumme und überprüfe den Rest des byte-Arrays selbst nochmal mit crc. Es ist also nur ein Paket, was ich sende Da ich nur ein Paket sende und immer erst auf die Bestätigung warte, ist das kein Problem. Ja, das stimmt. Wenn der Client 10 Sekunden nicht sendet, dann hat er halt Pech. Das ist eine Tatsache, die man nur mit TCP handeln kann. In diesem Fall wird der Client eben eine Exception, die ich extra behandeln muss. Aber wie du auch schon gesagt hast, die andere Seite wäre, die Sockets einfach offen zu lassen. Da nehm ich lieber in Kauf, dass der Client sich beenden muss. Ja, aber erst, wenn ich das Modul bestanden habe
  22. Normaler Weise schon. Es ist ja auch meine Aufgabe, das so zu implemetieren, dass alles sauber funktioniert. Mein Server setzt nach seiner Antwort auf des Startpaket des Clients einen int-Wert zunächst auf 1, heißt, dass er für das nächste(also das erste Datenpaket) ein ack von 1 erwartet. Der Client schickt das erste Paket erst los, wenn er die Antwort des Server mit der Portnummer erhlaten hat. Dieses erste Paket hat natürlich den ack=1. Bekommt der Server das Paket setzt er seinen Wert des nächsten zu erwartenden acks auf 2 und schickt dem Client ein Paket von 6 byte( short( 2 ) + int( crc ) ). Wenn der Client das Paket bekommt, dann schickt er sein nächstes Paket mit ack 2. Der ack-Wert wird dabei immer abwechselnd auf 1 und 2 geändert, was ja kein Problem ist beim Stop-and-Wait-Protokoll. Angenommen ein Paket geht verloren, so wie du es beschrieben hast, dann bekommt mein Server ein Paket, welches er schon erhalten hat eben nochmal. Ich würde aber zunächst prüfen, ob das ack mit dem, was der Server als nächstes erwarten würde übereinstimmt. Ist das nicht der Fall, dann sendet der Server einfach nochmal das letzte Antwortpaket und ignoriert das Paket. Aber nicht, wenn mein Server sich erst die letzten 4 bytes holt, die der crc16-Prüfung des Clients entsprechen und die restlichen Daten dann selbst mit seiner eigenen crc16-Tabelle überprüft. Stimmte der Wert nicht überein, was bei zufälligen Paketen auf jeden Fall der Fall sein wird, dann ignoriert er das Paket Ganz so schlimm ist es dann doch nicht. Mein Server verwendet ein Timeout von ca 10 Sekunden in seinen Threads. Entweder er bekommt ein Paket, oder die 10 Sekunden sind um. In diesem Fall gehe ich einfach davon aus, dass der Client nichts mehr sendet. Also mir ist schon klar, dass es am Ende ein Programm ist, dass man mal geschrieben hat um ein wenig Sockets zu üben und dann nie wieder verwendet. Ich hätte auch lieber TCP genommen und anstelle von Stop-and-Wait einen Puffer von ca 10 Paketen verwendet, aber die Aufgabe unseres Profs schreibt es so vor
  23. crc16 dient nur dazu um Fehler durch die Übertragung zu erkennen. Die Reihenfolge ist auch kein Thema, weil wir das Stop-and-Wait-Protokoll nehmen sollen. Hat der Server ein Paket bekommen, sendet er ein Paket an den Client zurück und der Client warten mittels eines Timeouts auf dieses Paket. Läuft das Timeout ab, sendet der Client das Paket nochmal. Das nächste sendet er erst, wenn er die richtige Antwort vom Server bekommen hat. Harte Worte, aber keine Angst. Ich hab mir den Netzwerkteil im Wesley-Buch durchgelesen und auch verstanden. Mir ist völlig klar, dass dieses Programm totaler Humbug ist, weil weder Stop-and-Wait, noch UDP dafür geeingnet sind, aber unser Prof will es so und wenn er nen crc16 haben will, dann bekommt er es hlat. Ob wir was sinnvolles programmieren oder nicht ist ihm dabei auch völlig egal, er will nur sehen, dass wir es können^^
  24. Ja, da habt ihr natürlich Recht Ich muss das aber als Prüfungsvorleistung realisieren. "Datenübertragung mittels UDP und Stop and Wait". Es kommt ja noch eine crc16-Überprüfung hinzu. Das war der einzige Punkt wo ich etwas ins Grübeln gekommen bin. Der Client ist nicht das Problem, dem ist ja egal ob mein Server Threads verwendet oder nicht. Das mit den Threads und den Sockets habe ich jetzt auch verstanden, dank euch. Danke für eure Nerven
  25. Ich glaub meine Problembeschreibung ist einfach zu schlecht:old Deine Erklärung dazu hatte ich beim ersten Mal verstanden. Ich möchte nur eines wissen: Angenommen mein Server hat 100 Sockets auf Port 1300 bis 1400 offen, auf denen grade Dateien übertragen werden undzwar jede in einem Thread. Nun kommt eine neue Datenübertragung von einem weiteren Client rein. Alles was ser Server machen muss ist ja nur ein neuen Port suchen und das Startpaket an den Thread übergeben. Weil dieser Thread dann einen Socket erstellt und auf einem Port lauscht, der noch nicht belegt ist, verwende ich auch keine ID mehr, denn auf diesem Port kommen ohnehin nur Pakete von diesem einen Client rein. So meintest du es doch, oder? Meine Frage bezieht sich aber auf "Server sucht sich einen freien Port", denn damit das ganze überhaupt funktioniert muss ich mir ja einen Port suchen, der von keinem anderen Socket verwenden wird. Ich würde mir nämlich einfach einen int anlegen, den ich mit 1024 initialisiere und ihn dann immer höchzählen lasse. Wenn ich also irgendwann bei Port 65535 angekommen bin und wieder bei 1024 anfange, dann möchte ich gern wissen ob mein erster Thread, der Port 1024 bekommen hatte schon mit seiner Datei fertig ist, die beispielsweise 50GB umfasst. Der Server soll also prüfen "Wird grade eine Datei auf Port 1024 übertragen". Wenn ja, dann versuch es mit 1025, wenn nein, nimm den Port und übergib das Paket mit dem Port an einen neuen Thread. Ich hoffe, ich konnte es einigermaßen verständlich beschreiben;) edit: Ich hab grad mit einem Ping-Server getestet was passieren würde, wenn ich einen Socket mit einem Port anlege, der schon von einem anderen Socket verwendet wird, allerdings TCP. In diesem Fall wird eine BindException angezeigt und das Programm stürzt ab. Das hab ich nicht gewusst. Eigentlich sagt einem Eclipse ja, wenn eine Exception nicht behandelt wurde. Ich denke, das sollte das Problem mit bereits verwendeten Ports abwenden. Vielleicht war meine Frage einfach so trivial, dass ein Javagott einfach nicht so dumm denken kann

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...