Написал я эту програмку, вот выкладываю решение моей проблемы на случай если ктото сюда попадет в своих поисках.
Вся проблема в том что данные из стандартного потока ввода читаются в текстовом режиме, некоторые байты поэтому искажаются и принимаются как управляющие. Все было бы просто если бы
нужно было читать из файла(переоткрыть файл делов то), но так как стандартный поток ввода уже открыт, его необходимо перевести в бинарный режим чтения не закрывая.
Вот функция(работает в Microsoft Visual C++ 6.0, в досовском С++ вроде такая тоже есть но без нижнего подчеркивания), которая в данном случае переводит стандартный поток ввода в бинарный режим чтения:
_setmode(_fileno(stdin),_O_BINARY); //(хочу заметить что найти нужную функцию в инете почемуто оказалось нелегко)
После того как stdin переведен в бинарный режим остается дело техники - разобрать данные POST запроса.
Вот моя програмка(скомпилировать в Microsoft Visual C++ 6.0 как консольное приложение и положить в папку cgi на веб сервере) по загрузке 4-х файлов.
// loader.cpp : Defines the entry point for the console application.
int cmp_rez=strcmp(REQUEST_METHOD,"POST");
if (cmp_rez==0)
{
int tmp_count,stop;
char ch;
char terminator[term_size];
strset(terminator,'1');
long int num_of_bytes=atoi(CONTENT_LENGTH);
long int readed;
// пожалуй самое главное:
_setmode(_fileno(stdin),_O_BINARY); // устанавливаем стандартный поток ввода(stdin) в бинарный режим чтения!
//получаем терминатор - разделитель данных в POST запросе
terminator[0]='\r';
terminator[1]='\n';
for (tmp_count=2,stop=0;((stop==0)&&(tmp_count<term_size));tmp_count++)
{
ch=fgetc(stdin);
terminator[tmp_count]=ch;
if (tmp_count>5)
{
if (terminator[tmp_count]=='\n')
{
stop=1;
terminator[tmp_count]=0;
}
}
} // терминатор получен.
char tmp_header[header_size];
char filename[30]="";
long int term_len=strlen(terminator);
// загрузка первого файла
get_header(tmp_header); // прочитать заголовок перед телом файла
get_filename(tmp_header,filename); // взять из заголовка имя файла
readed=get_filebody(terminator,filename,num_of_bytes); // прочитать тело файла и сохранить
printf("filename:%s;<br>\n",filename);
filename[0]='\0';
// загрузка второго файла
get_header(tmp_header);
get_filename(tmp_header,filename);
num_of_bytes-=readed;
readed=get_filebody(terminator,filename,num_of_bytes);
printf("filename:%s;<br>\n",filename);
filename[0]='\0';
// загрузка трельего файла
get_header(tmp_header);
get_filename(tmp_header,filename);
num_of_bytes-=readed;
readed=get_filebody(terminator,filename,num_of_bytes);
printf("filename:%s;<br>\n",filename);
filename[0]='\0';
// загрузка четвертого файла
get_header(tmp_header);
get_filename(tmp_header,filename);
num_of_bytes-=readed;
readed=get_filebody(terminator,filename,num_of_bytes);
printf("filename:%s;<br>\n",filename);
filename[0]='\0';
}
return 1;
}
Это для того чтобы Apache не выдавал "Internal error", вобщем в данном коде вроде больше нагрузки не несет.
Artisan: $ man 3 fgetc
If the stream is at end-of-file or a read error occurs, the routines return EOF. The routines feof(3) and and ferror(3) must be used to distinguish between end-of-file and error.
Прописал feof в коде и ferror, оказалось при загрузке картинки браузер присылает только первых +-50 байтов :-0
Надо внизу страницы разместить блок(table2), так чтобы при растягивании в высоту страницы он всегда был там, кроме того случая когда какой нибудь текст выше будет смещать блок(table2) еще ниже.
Я описал эту ситацию с помощью таблицы table1, вопрос как сделать аналогично не используя table1?
Спасибо всем за ссылки. Но вот появилась другая мысль домены в зоне .com.ua получаются дороже чем в зоне .com, хотя ИМХО домен второго уровня лучше чем третьего.
В чем тут дело у домена в зоне .com.ua есть какие то приимущества?🙄
А мне не нравится шапка цвет фона синий цвет шрифта тусклый, а когда наводиш на ссылку фон становится черным а ссылка белой не приятно читать. А в остальном дизайн более менее.
djkostya: Самый простой путь без всяких распознованием картинок (ну кроме бара конечно)
Это
1 Записываем картинку на диск
2 узнаём контрольную сумму
3 сравниваем контрольную сумму с базой
Выводи результат...
Всё
На мой взгляд это одна большая головная боль: вычисльть несколько тысяч контрольных сум и сопоставлять числами для формирования базы. А если картинку Яндекса вдруг решат немного изменить, то что начинать делать базу сначала?☝
Написал я эту програмку, вот выкладываю решение моей проблемы на случай если ктото сюда попадет в своих поисках.
Вся проблема в том что данные из стандартного потока ввода читаются в текстовом режиме, некоторые байты поэтому искажаются и принимаются как управляющие. Все было бы просто если бы
нужно было читать из файла(переоткрыть файл делов то), но так как стандартный поток ввода уже открыт, его необходимо перевести в бинарный режим чтения не закрывая.
Вот функция(работает в Microsoft Visual C++ 6.0, в досовском С++ вроде такая тоже есть но без нижнего подчеркивания), которая в данном случае переводит стандартный поток ввода в бинарный режим чтения:
_setmode(_fileno(stdin),_O_BINARY); //(хочу заметить что найти нужную функцию в инете почемуто оказалось нелегко)
После того как stdin переведен в бинарный режим остается дело техники - разобрать данные POST запроса.
Вот моя програмка(скомпилировать в Microsoft Visual C++ 6.0 как консольное приложение и положить в папку cgi на веб сервере) по загрузке 4-х файлов.
PS: не совсем сохранились сдвиги в коде:(
я не сишник, но мне немного не понятно зачем
printf("Content-type: text/html\n");
printf("Pragma: no-cache\n");
printf("\n");
при сохранении файла :\ в частности бинарного
Это для того чтобы Apache не выдавал "Internal error", вобщем в данном коде вроде больше нагрузки не несет.
$ man 3 fgetc
If the stream is at end-of-file or a read error occurs, the routines return EOF. The routines feof(3) and and ferror(3) must be used to distinguish between end-of-file and error.
Прописал feof в коде и ferror, оказалось при загрузке картинки браузер присылает только первых +-50 байтов :-0
А как же взять остальную часть картинки?
PS: ferror выдает 0.
Надо внизу страницы разместить блок(table2), так чтобы при растягивании в высоту страницы он всегда был там, кроме того случая когда какой нибудь текст выше будет смещать блок(table2) еще ниже.
Я описал эту ситацию с помощью таблицы table1, вопрос как сделать аналогично не используя table1?
Благодарю за помощь, все работает.
Посмотри на http://infostore.org/
вот только там какието сложности если вы не из Украины.
Спасибо всем за ссылки. Но вот появилась другая мысль домены в зоне .com.ua получаются дороже чем в зоне .com, хотя ИМХО домен второго уровня лучше чем третьего.
В чем тут дело у домена в зоне .com.ua есть какие то приимущества?🙄
А мне не нравится шапка цвет фона синий цвет шрифта тусклый, а когда наводиш на ссылку фон становится черным а ссылка белой не приятно читать. А в остальном дизайн более менее.
Самый простой путь без всяких распознованием картинок (ну кроме бара конечно)
Это
1 Записываем картинку на диск
2 узнаём контрольную сумму
3 сравниваем контрольную сумму с базой
Выводи результат...
Всё
На мой взгляд это одна большая головная боль: вычисльть несколько тысяч контрольных сум и сопоставлять числами для формирования базы. А если картинку Яндекса вдруг решат немного изменить, то что начинать делать базу сначала?☝
Надо в IE меню сервис вкладка конфиденциальность уровень защиты понизить или если стоит фаервол, то он может блокировать там надо настройки поменять.
Отписал в личку.