Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как чере сокеты передать файл неизвестного размера, дайте примерчик пожалуйста 
V
    Опции темы
Nuzur
Дата 6.7.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5




я волшебное слово знаю, нада smile 


--------------------
Never again...
PM MAIL   Вверх
ptr
Дата 7.7.2006, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Передавай его частями и каждой части делай пометку последняя или нет это часть. 


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Romikgy
Дата 7.7.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



А что нельзя сначала передать размер файла , а уж потом передавать его ?! 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Nuzur
Дата 7.7.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



Ладно, а можно примерчик? 


--------------------
Never again...
PM MAIL   Вверх
ptr
Дата 7.7.2006, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Nuzur, а что это за файл такой без размера? 

Цитата(Romikgy @  7.7.2006,  13:10 Найти цитируемый пост)
А что нельзя сначала передать размер файла , а уж потом передавать его ?!  

Можно, но размер то неизвестен.

Цитата(Nuzur @  7.7.2006,  13:55 Найти цитируемый пост)
Ладно, а можно примерчик?  

Пример чего? Работы с сокетами?  

Это сообщение отредактировал(а) ptr - 7.7.2006, 10:05


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Romikgy
Дата 7.7.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(ptr @  7.7.2006,  09:00 Найти цитируемый пост)
Можно, но размер то неизвестен.

Имхо размер на этой стороне не известен , а на той он известен , вот с той стороны пусть и передадут размер файла 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Nuzur
Дата 7.7.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



просто суть в том что в файле который передаеться может быть замечательный символ 0x00 и тогда все буферы полетят в трам-та-ра-рым, я сейчас использую send и recv в результати чего могут быть осложнение в виде пенкофф от начальства  smile .
Файл обычный, тоесть rar, там ведь может встретиться абсолютный нуль правильно? 


--------------------
Never again...
PM MAIL   Вверх
sergejzr
Дата 7.7.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Кодируй в BASE64 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Nuzur
Дата 7.7.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



Цитата(sergej.z @ 7.7.2006,  12:40)
Кодируй в BASE64

В 2-х словах пожалуйста, что это такое и если можна с примером, пожалуйста. 


--------------------
Never again...
PM MAIL   Вверх
sergejzr
Дата 7.7.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



BASE64 перводит содержимое файла в текст (т.е буквы ASCII) . При этом размер файла увеличивается всего на 1/3. Таким образом файл можно передавать между любыми системами без изменений. По приёму конвертим обратно и вуаля. 
В принципе Base64 везде и используется, где надо данные строкой передать.

А классов для кодировки/декодировки в нете навалом.

Добавлено @ 13:34 
Вот де/кодировщик (взят здесь)
Работает с файлами. Переделаешь под свою задачу, думаю, без проблем.
Код

// BASE64.C
// Stream
// ----------    Version 06.11.2003
//               Borland IDE C++ 3.1 oder 5.1
//               bearbeitet: www.GoBlack.de, D.Schwarzer

// Das Programm wandelt Klartextzeilen einer Eingabedatei,
// in Base64-Text um und speichert diesen in einer
// Ausgabedatei. Funktion: encode().
// Die Umkehrung ist ebenfalls möglich. Funktion decode().

// Anwendung: Das Programm wird mit Parametern aufgerufen.
// Der erste Parameter gibt die Kodierungsrichtung an
// -e Kodiere von Klartext nach Base64
// -d Dekodiere von Base64 nach Klartext

// Die beiden folgenden Parameter geben die Namen der Ein-
// gabe- und der Ausgabedatei an. Beispiel: ..
// base64.exe -e in.txt out.txt
// Sind diese Dateien nicht vorhanden so kann die Standard-
// Ein-/ Ausgabe verwendet werden.

#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>

#define linelen 76       // Base64 erlaubt, max 76 Zeichen

// Dieser String enthält neben den Base64-Zeichen auch das
// Padding-Zeichen '=' auf der Position 0x40.
char base64tab[] =       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                         "abcdefghijklmnopqrstuvwxyz"
                         "0123456789+/=";


// encode()
// kodiert die Klartext-Daten des 'in'-Streams nach Base64
// und gibt sie zum 'out'-Stream weiter
void encode (FILE* in, FILE* out)
{
 int  n=0, m=0, i=0;
 char c=0;
 char obuf[4];

 while(1){
  for(i=0; i<linelen/4; i++){        // Zeilenlänge
   obuf[0]=obuf[1]=obuf[2]=obuf[3]=0;

   for(n=0; n<3; n++){               // 3 mal aus Stream ..
    c=fgetc(in);                     // .. Eigaben holen
    if(c==(char)EOF){
      if(n==0) return;
      for(m=1; (m+n)<4; m++)obuf[n+m]=0x40; n=3;}
    else if(n==0){obuf[0]+=(c>>2); obuf[1]+=((c&0x03)<<4);}
    else if(n==1){obuf[1]+=(c>>4); obuf[2]+=((c&0x0F)<<2);}
    else if(n==2){obuf[2]+=(c>>6); obuf[3]+=(c&0x3F);     }
   }
   // Base64-Code zum out-Stream ausgeben
   for(n=0; n<4; n++)fputc(base64tab[obuf[n]],out);
   if(c==(char)EOF) return;
  }
  fputc('\r',out); fputc('\n',out);  // Zeilenumbruch
 }
}


// ------------------------------------------------------//
// decode()
// decodiert die Base64-Daten des 'in'-Streams zu Klartext
// und gibt sie zum 'out'-Stream weiter.

void decode (FILE* in, FILE* out)
{
 int  n=0, m=0;
 char c=0;
 char obuf[3];

 while(c!='=' && c!=(char)EOF){
  obuf[0]=obuf[1]=obuf[2]=0;       // Klartext-Buffer=0

  for(n=0; n<4; n++){
   c=fgetc(in);                    // Zeichen holen
   if(isspace(c)){n--; continue;}  // whitespc überspringen

   // test ob Zeichen in der Tabelle, m gibt den Code an
   for(m=0; m<=0x3F && c!=base64tab[m]; m++);

   if(m>0x3F) break;
        if(n==0){obuf[0]+= (m<<2);}
   else if(n==1){obuf[0]+= (m>>4); obuf[1]+=(m<<4);}
   else if(n==2){obuf[1]+= (m>>2); obuf[2]+=(m<<6);}
   else if(n==3){obuf[2]+=  m;}
  }
  // Klartext zum out-Stream ausgeben
  for(m=0; m<3 && obuf[m]!=0; m++) fputc(obuf[m],out);
 }
}


// ------------------------------------------------------//
// main()
// Testprogramm der beiden oberen Funktionen. main() müssen
// die Kodierrichtung -e (encode) oder -d (decode) sowie die
// Namen der zu bearbeitenden Dateien in und out angegeben
// werden.

void main(int argc, char* argv[])
{
 FILE *in, *out;

 printf ("Base64 [Start]\r\n");

 if(argc>2 && strcmp(argv[2], "-")){
   if((in=fopen(argv[2], "rb"))== NULL)
               printf(" ..Eingabedatei nicht gefunden\r\n");
 }else in = stdin;    // Eingabe von der Tastatur / Clrl-C

 if(argc > 3 && strcmp(argv[3], "-")){
   if((out=fopen(argv[3], "wb"))== NULL)
               printf(" ..Ausgabedatei nicht gefunden\r\n");
 }else out = stdout;  // Ausgabe zum Bildschirm

 if       (!strcmp(argv[1], "-e")){
        encode(in, out);
        fclose(in);
        fclose(out);
 } else if(!strcmp(argv[1], "-d")){
  decode(in, out);
  fclose(in);
  fclose(out);
 } else          printf(" ..unbekannter Parameter\r\n");
 printf ("Base64 [Ende]\r\n");
 getch();
}


И вот ещё. Там внизу на странице де/кодировщик smile
http://www.arndt-bruenner.de/mathe/scripts/base64.htm  


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 7.7.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Цитата(Nuzur @ 7.7.2006,  11:16)
просто суть в том что в файле который передаеться может быть замечательный символ 0x00 и тогда все буферы полетят в трам-та-ра-рым, я сейчас использую send и recv в результати чего могут быть осложнение в виде пенкофф от начальства  smile .
Файл обычный, тоесть rar, там ведь может встретиться абсолютный нуль правильно?

Имхо это все может случатся если передавать данные как строку  


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Nuzur
Дата 7.7.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



Romikgy, В том то и жир что передаю его как строку, иначе не парился б! 


--------------------
Never again...
PM MAIL   Вверх
sergejzr
Дата 7.7.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Nuzur, тогда именнo Base64 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Romikgy
Дата 7.7.2006, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



Nuzur, юзай то что делается в емайле, один из вариантов предложил 
sergej.z  


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Nuzur
Дата 7.7.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: нет
Всего: 5



2sergej.z  а опание можно не на немецком либо что-то другое в етом духе. 


--------------------
Never again...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.