2015-07-19 2 views
0

im пытается отправить файл через сокет, но я бы хотел также отправить имя файла, например.C# socket отправить информацию

это код посыла:

 int count = 0; 
    int size; 
    private int SendVarData(Socket s, byte[] data) 
    { 
     total = 0; 
     int size = data.Length; 
     int dataleft = size; 
     int sent; 


     datasize = BitConverter.GetBytes(size); 
     sent = s.Send(datasize); 


     sent = s.Send(data, total, dataleft, SocketFlags.None); 
     total += sent; 
     dataleft -= sent; 
     // MessageBox.Show("D"); 

     return total; 
    } 

это вызов

 byte[] arr = File.ReadAllBytes(file); 
     SendVarData(sc, arr);//sc is a socket ofcourse. 

я хотел бы послать также имя файла, как я сказал. должен ли я отправить его один раз перед отправкой файла? или есть другой эффективный способ отправить оба?

это код получить:

private byte[] ReceiveVarData(Socket s) 
    { 
     int total = 0; 
     int recv; 
     byte[] datasize = new byte[4]; 

     recv = s.Receive(datasize, 0, 4, 0); 
     size = BitConverter.ToInt32(datasize, 0); 
     int dataleft = size; 
     //MessageBox.Show(size.ToString()); 
     byte[] data = new byte[size]; 


     while (total < size) 
     { 
      recv = s.Receive(data, total, dataleft, 0); 
      if (recv == 0) 
      { 
       break; 
      } 
      total += recv; 
      dataleft -= recv; 
     } 
     return data; 
    } 

любая помощь будет apperciated.

ответ

0

Я не думаю, что это важно, отправляете ли вы его до или после файла. Вам нужен протокол, например, сначала отправить длину имени файла, затем имя файла, а затем длину файла и самого файла или наоборот. На стороне приема вы можете дифференцировать сообщения сейчас, потому что вы знаете длину каждого фрагмента (если две переменные длины всегда содержат 4 байтовых целых числа).

+0

Большое спасибо, но я бы не хотел использовать сетевые потоки в моем проекте (личная причина, по которой это действительно не важно, почему: D), но если я хочу отправить имя файла и прочитать его (только имя) В первый раз. Я также должен создать буфер, который длиннее имени.lenth. как я могу узнать длину имени файла? я должен отправить его еще до отправки ** имени файла **? @Giorgi –

+0

@itapi: да, отправьте его тоже –

+0

один последний вопрос, теперь мне нужно отправить длину имени файла, как вы сказали. как я могу узнать длину длины имени файла? я имею в виду, если его 12 символов, так что 12 на самом деле 2 строки длины. как я могу узнать в другой стороне, какая длина и сколько читать в этой строке? 'recv = s.Receive (datasize, 0, XXX, 0);' –