Evgenios1 Δημοσ. 8 Μαρτίου 2009 Δημοσ. 8 Μαρτίου 2009 Γεια σας παιδια. Λοιπών φτιαχνω ενα προγραμμα με το οποιο διαφοροι χρηστες θα μιραζοντε αρχεια. Μεχρι τωρα δεν εχω καποιο σοβαρο προβλημα. (Ειναι σε cs με .net2) Εχω μια κλαση client και μια srv η τελευτεα βαιβεα τρεχει σε διαφοριτικο thread αλλα στο ιδιο προγραμμα. Η λογικη που ακουλουθω για την αποστολη ειναι η εξης: Εχω εναν struct ονοματης Header ο οποιος εχει διαφορες τημες Header Ip (bytes 4) From(bytes 128) RequestFor (bytes 128) LastPacketLenght(bytes 4) NumOfPacket(byte 4) O Header Εχει 2 cntr ο ενας Header(IPAddress ip, string name,string Rfor,int len,int packs) και Header(byte[] packet) , Και 4 Getters (funcs) (returns name(string) ip(IPAddress) etc) Εχοντας το παραπανω ως ενα byte array μεγεθους 264, το στελνω απο το client -> srv και ο srv εχει δυο βηματα >... //Α) παραλαβη στοιχειων(header) buffer=new byte[Header.HeaderSize]//(264) sc.Recive(buffer);//sc System.Net.Sockets.Socket sc.Send(buffer);//αποστολη πισω για σύγκριση(μπορει και να το βγαλω αυτο το βημα) Header h=new Header(buffer); //loop για τα πακετα FileSpliter fs=new FileSpliter("dir & name to save the file");//μια κλαση που εκανα για να σπαω τα αρχει σε πακετακια των 100*1024byte for(int i=0;i<h.GetPacketsNum();i++) { if(i<h.GetLastPacket()){ buffer=new byte[h.OriginalPacketSize] ; sc.Recive(buffer); fs.Add(buffer); } else { buffer=new byte[h.GetLastPacketSize()]; sc.Recive(buffer); fs.Add(buffer); } fs.Close(); } .... και ο πελατης >FileSpliter fs=new FileSpliter("file"); List<Array> packets= fs.Split(); Header h=new Header(this.IP,this.Name,"REQUEST:NONE",fs.PacketsNum,fs.LastPacketSize); sc.Send(h.GetPacket()); sc.Recive(buffer); if(h==new Header(buffer)) { //loop για αποστολη πακετων } Αυτο δουλευει καλα .... μήπως υπάρχει κάτι άλλο? Με χαλάει που πρέπει να ανοίγω τοις πόρτες στο ρουτερ για να δουλέψει(υπάρχει τρόπος ώστε να μην ανοίγω πόρτες?) Και κατι αλλο... εαν την ωρα που γίνεται το παρε δώσε με σερβερ Α και πελατη Α και ερθει ο πελατης Β τι θε γινει ?? -------------------------- Στη κλαση FileSpliter αντιμετοπιζω ενα ακυρο προβλημα οταν βαζω ενα αρχειο text (.txt .html .xml ) ειναι gg αλλα οταν βαλω ενα bin file πχ .jpg παει περιπατο ... η αντιγραφη γινεται κανονικα (πχ 123.123 byte αντιγραφοντε 123.123 byte) αλλα το αρχειο δεν ανοιγει και οταν το ανοιγο με nodepad μου βγαζει κινεζικα γραμματα ΜΟΝΟ οχι συμβολα Δουλευω με BinaryWriter/Reader omg και 3 lol Εχω σκαλοσει ασχιμα!!! Εχω κανει μια κλαση η οποια κοματιαζει ενα αρχειο..(και καλα τωρα) εδω ειναι!! >using System; using System.IO; using System.Collections.Generic; using System.Text; namespace omg_kai_3_lol { class Program { static void Main(string[] args) { FileSpliter fs = new FileSpliter(); fs.SpliteComplite += new FileSpliter.SplitCompliteHandler(fs_SpliteComplite); fs.FileWrited += new FileSpliter.FileWritedHandler(fs_FileWrited); List<Array> buffer = fs.Split(@"E:\qq.mp3"); fs.BiuldFile(buffer, @"E:\copy-qq.mp3"); Console.Read(); } static void fs_FileWrited() { Console.WriteLine("Complite"); } static void fs_SpliteComplite(int packs, int len) { Console.WriteLine("File was splited!"); Console.WriteLine("Packets:{0}\nLast packet lenght:{1}",packs,len); Console.WriteLine("Writing...."); } } public class FileSpliter { //max size 100kb 1024*100 public delegate void SplitCompliteHandler(int packs, int len); public delegate void FileWritedHandler(); public event SplitCompliteHandler SpliteComplite; public event FileWritedHandler FileWrited; public const int Max_Size = 1024 * 100; private FileStream br = null; private List<Array> bigbuffer; private byte[] buffer; private int parts; private int fileLen; private byte[] smallbuffer; private FileStream bWriter; private byte[] fileBuffer; public FileSpliter() { bigbuffer = new List<Array>(); SpliteComplite += new SplitCompliteHandler(FileSpliter_SpliteComplite); this.FileWrited += new FileWritedHandler(FileSpliter_FileWrited); } void FileSpliter_FileWrited() { } void FileSpliter_SpliteComplite(int packs, int len) { } public List<Array> Split(string file) { unsafe { FileInfo f = new FileInfo(file); fileLen = (int)f.Length; f = null; br = new FileStream(file, FileMode.Open); fileBuffer = new byte[fileLen]; try { br.Read(fileBuffer, 0, fileLen); } catch { } br.Close(); parts = fileLen / Max_Size; buffer = new byte[Max_Size]; for (int i = 0; i < parts; i++) { for (int y = 0; y < Max_Size; y++) { buffer[y] = fileBuffer[(i * Max_Size) + y]; } bigbuffer.Add(buffer); } int m = fileLen - parts * Max_Size; buffer = new byte[m]; for (int i = 0; i < m; i++) { buffer[i] = fileBuffer[(parts * Max_Size) + i]; } bigbuffer.Add(buffer); SpliteComplite(bigbuffer.Count, bigbuffer[bigbuffer.Count - 1].Length); return bigbuffer; } } public void BiuldFile(List<Array> allPackets, string fileName) { unsafe { parts = allPackets.Count; List<byte> te = new List<byte>(); bWriter = new FileStream(fileName, FileMode.Create); for (int i = 0; i < allPackets.Count; i++) { for (int t = 0; t < allPackets[i].Length; t++) { te.Add((byte)allPackets[i].GetValue(t)); } } byte[] nnn = te.ToArray(); try { bWriter.Write(nnn, 0, nnn.Length); } catch { } this.FileWrited(); bWriter.Close(); } } public int Parts { get { return parts; } } public int FileSize { get { return fileLen; } } } } Το προβλημα ειναι απεριγραπτο , απλα καντε ενα build και αντιγραψτε ενα αρχειο mp3 και θα καταλαβετε.... (σε unsafe mode) HELP το mp3 οχι μονο πεζει αναποδα , αλλα και μονο ενα cute... το ποιο ακυρο ειναι οτι τα tags αντιγρφοντε σωστα (?!?)
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.