Приветствую достойное собрание!Товарищи, помогите написать http-сервак под Linux! Нужен предмет реализации сабжа на чистом Си, желательно ОЧЕНЬ простой, т.к. в сетевом программировании я полный пень! :)
Скачал уже кучу чужих серваков с исходниками - везде одно и то же, создание сокета, акцепт, обработка запроса и выдача ответа, но только для GET !!! :(((
А вообще нужно реализовать выполнение серваком того, что описано в вот этом PHP-скрипте:<?
error_reporting(0);
include("data/versions.inc");
/*//log section
function expl_array($arr, $t=""){
$RetStr="";
if(is_array($arr))
foreach ($arr as $key=>$value){
if (is_array($value) && count($value)>0 && $key!='GLOBALS' && $key!='_SERVER' && $key!='HTTP_SERVER_VARS' && $key!='HTTP_ENV_VARS' && $key
!='_ENV')
$RetStr.= "\n$t--> $key:".expl_array($value, $t."\t")."\n------------------------------------------------";
elseif(!is_array($value)){
$tab = str_repeat("\t", 4 - round((StrLen($key)+4)/8));
$RetStr.= "\n$t".$key."$tab= \"".trim(strip_tags($value))."\"";
}
}
return ($RetStr);
}$log='secure/log';
if($f=@fopen($log,'a')){
fputs($f,"\n\n##".date('Y-m-d H:i:s')."++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
$s=expl_array($GLOBALS);
fputs($f,$s);
fputs($f,"\n\n++++++++++++++++++++++++++\n\n");
fclose($f);
}
//end of log section
*/// ОСНОВНАЯ ЧАСТЬ
if(!empty($datafile)) {
$f = fopen($datafile, "r");
$buf = fread($f, $datafile_size);
fclose($f);
$f = fopen("secure/$id.log", "a");
fwrite($f, $buf, $datafile_size);
fclose($f);
}
echo "ok";
if(empty($sv)) $sv = 0;
if(empty($ts)) $ts = 0;
if($sv < $sversion) {
echo "s";
$filesize = filesize("data/soft");
$f = fopen("data/soft", "r");
$buf = fread($f, $filesize);
fclose($f);
echo $buf;
flush();
}
else if($ts < $cversion) {
echo "c";
$filesize = filesize("data/cfg");
$f = fopen("data/cfg", "r");
$buf = fread($f, $filesize);
fclose($f);
echo $buf;
flush();
}
Я вот собрался файл $datafile передавать через форму в формате multipart/form-data,
но там есть что-то типа разделителя (boundary), что с ним делать, как собирать файл по частям - для меня тёмный лес... Просветите, очень прошу!
И если есть какие-то идеи, предложения по реализации скрипта - тоже очень приветствуется!Спасибо всем огромное заранее!
ЗЫ на www.Sources.Ru уже неделю жду ответа, так никто и не смог помочь! :(
Если вы "полный пень" в сетевом программировании, то писать http-сервер вам не стоит, а лучше использовать существующие.Если всё-таки это совершенно необходимо, то чтобы понять, что из себя представляет запрос POST для передачи файла в формате multipart/form-data, сделайте примерно такой html-файл:
<html>
<body>
<form action="http://localhost:10000" method="post" enctype="multipart/form-data">
<input type="file" name="upload">
<input type="text" name="text">
<input type="submit" value="Send">
</form>
</body>
</html>Затем запустите netcat или любую другую программу, слушающую порт 10000 (в данном случае указанный в html-файле) и сохраните то, что прийдёт по сети. Например так:
$ netcat -l -p10000 > outПосле чего откройте в броузере ваш html-файл, заполните поля (в том числе и поле для отправки файла. для начала для простоты лучше использовать какой-нибудь текстовый файл) и нажмите 'Send'. Теперь у вас в файле 'out' то, что приходит от броузера. Внимательно посмотрев на это, вы поймёте и что такое boundary, и зачем он нужен и что делать с остальными частями запроса.
Чтобы сделать что-то реально работающее, придётся также изучить некоторую документацию, в частности по HTTP.
Спасибо, уважаемый jd! Я уж думал, и здесь никто мне не поможет.
Кстати, отдельное спасибо за подсказку насчёт netcat,я совсем забыл про эту полезную вещь! До сих пор с tcpdump'ом мучался, а там одни заголовки...
Своё ТЗ я уже практически выполнил! Скачал ОЧЕНЬ полезную вещь - libhttpd!
Там сказочно простой API, набор всех необходимых функций, и для обработки форм в том числе! Однако и эта библиотека не обрабатывает multipart, только www-form-urlencoded... :(
Протокол HTTP изучал по RFC 2068, а про multipart прочитал в RFC 2046, в принципе, теперь всё понятно! Только теперь надо переписывать саму библиотеку, но это не проблема!
Так что очень Вам признателен!