Προς το περιεχόμενο

Μεταφορα αρχειων με TCP (.net 2)


Evgenios1

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδια.

Λοιπών φτιαχνω ενα προγραμμα με το οποιο διαφοροι χρηστες θα μιραζοντε αρχεια.

Μεχρι τωρα δεν εχω καποιο σοβαρο προβλημα.

(Ειναι σε 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 αντιγρφοντε σωστα (?!?)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...