• XSS.stack #1 – первый литературный журнал от юзеров форума

В поисках языка для работы с веб-протоколами

Quake3

TPU unit
Забанен
Регистрация
03.11.2010
Сообщения
4 529
Решения
4
Реакции
5 305
Депозит
0.046
Пожалуйста, обратите внимание, что пользователь заблокирован
Просьба не считать тему холиваром или провокацией, просто очень интересно узнать различное мнение со стороны.

В последнее время я начал задумываться над выбором какого-нибудь языка для разносторонней работы с сетью. Под работой с сетью я имею ввиду не ддос боты (с ними то как раз все ясно, там сокеты/апи + асм/си), а различные парсеры, чекеры, реггеры, спамеры и так далее. Актуально это не только для комерца - иногда для себя нужно что-то просканировать, спарсить, и т.д., а готовых инструментов или нет, или же они кривые/неактуальные/протрояненные/etc. В общем, не суть.
Хотелось бы найти какой-то язык для сети, чтобы он был:
а) Удобным. Кроме "чистых" сокетов хотелось бы какие-то либы, компоненты, и так далее, для более быстрой и простой разработки. Низкий уровень не всегда и не везде нужен, это не ддос же.

B) Относительно несложным в изучении. Чтобы ради одной сети не надо было вникать в какие-то дебри языка.

с)Хотелось бы гибкости и нормальной работы с большим количеством протоколов.

d) не особо "тяжелым" для системы (не так, что 1 скрипт загружает цпу на 99%).

С того, что я пробовал, могу отметить.
0. Масм и сокеты. Я считаю, что это не оправдано для "спамсофта". Слишком сложно и муторно писать все это на ассемблере, да и смысла уже нет.

1. РНР - фактически, php был (и есть) моим первым серьезным языком. Из плюсов, в нем могу выделить относительную простоту разработки, много документации и примеров. Для работы с сетью, как я понимаю, есть те же сокеты и стандартные функции (file_get_contents), курл, и какие-то расширения PEAR (хз кто ими пользуется).
Про минусы - лично мне сложно судить, но многие говорят, что пхп а)не поддерживает многопоточность (разве что мультикурл); б)медленно работает, грузит систему (с этим можно поспорить..); в) вообще существует для разработки сайтов, а не такого софта.

2. Perl - как я понимаю, в основном такие вещи пишут как раз таки на нем.Из негатива про него я слышал, что перл тяжел в изучении/сильно грузит систему. Ну и якобы он уже устарел и умирает.

3. Python - замечательный язык, относительно простой, куча либ, документации, примеров, кодеров. Если бы не жирный минус, который портит все плюсы - эти отступы в коде. Зачем их придумали - неизвестно, но считать пробелы в коде, это, имхо, извращение еще то. Тоже на нем не кодил практически, выбираю все между перлом и питоном.

4. Delphi - на этом языке написано наверное 95% прог для работы с сетью (да и ддос ботов). Огромное к-тво примеров, книг, мануалов, сорцев, библиотек (Инди, синапс, курл, и т.д.). Какие минусы - не знаю, единственный (лично для меня), это необходимость изучать полностью новый синтаксис (паскаль я не знаю вообще).

5. C++ builder очень похож на дельфи. Из плюсов - С подобный синтаксис, знание которого приходится и в яваскрипте, и в пхп. Из минусов - С++ со своими указателями, мильеном типов строк и т.д. наверное является самым сложным языком среди существующих.

6. Си шарп. Тут даже и не знаю. Язык сильно развивается, под него есть также много либ и т.д. Но требует фреймворк. Насколько это минус, не могу судить. По моему, щас эти фреймворки есть даже в сборках ХР.

Интересно услышать ваше мнение по выбору языка сугубо для net-кодинга. Или стоит остановится на php и не париться?
 
Если кодинг для себя, и не боты - я бы смотрел, несмотря ни на что, в сторону c#. Если сранивать с delphi - то это мамонты разных эпох.
Если скриптовые языки - php крути, т.к. по твоим словам он тебе ближе к телу.
А если кодинг ботов - masm.

Но есть старая истина про linux которая дейтвует и в твоем случае - бери тот язык, гуру которого живет ближе всего к тебе. (в новой интерпретации - гуру которого лучше тебе знаком). т.к. по манам все не выучишь и по-любому придется кого-то дергать.
 
Quake3
Perl советую, готовых компонентов куча - например LWP - мини-"браузер" со встроенной работой с куками, прокси и SSL, насколько я помню даже с ftp так же успешно работает как и с http; компоненты для работы с JSON, XML, CSV, БД (MySQL, SQLite, MSSQL, PostgreSQL) да и вообще почти со всем что понадобится :) ; на мой взгляд вполне сносная организация многопоточности; разумеется сокеты (также есть готовые с SSL); кодировки; перечислять можно долго...
Я думаю знаешь, что с си-подобным синтаксисом и чрезвычайной гибкостью (лишь стоит загуглить JAPH или другие различные "Perl-соревнования" :) ).

Для именно таких целей что ты описал (граббер, парсер, "повседневный" автоматизатор) я его всегда пользую и ни разу не остался недоволен.

Насчет того что умирает и устаревает - да, многие говорят, но пусть говорят что хотят, лично я например его пользовать не собираюсь прекращать. Компоненты и среда продолжают обновляться и по сей день, а умрет язык как мне кажется с последним программистом на нем, а Perl-программистов до сих пор немало.
О быстродействии - могу привести пример (хоть и без доказательств), как раз недавно делал граббер для одного крупного сайта, на 50 потоках данные граббились, парсились и инсертились в MySQL БД (примерно 8+ текстовых полей в таблице, на одном индекс) со скоростью >~7к записей в секунду, сервер был на той же машине, данные для инсерта разумеется приходили не в каждом ответе. ОП жрало навскидку 500+мб, на проце 2x2,4 ГГц параллельно еще можно было работать. Канал был не самый широкий. Были и есть мысли по оптимизации.
Оценивать вам.

Насчет сложности изучения - мне он показался не столь сложным.
Систему конечно порой неслабо грузит, но это как говорится как напишешь ;)

Да, тот же Python сейчас пользуют чаще и он популярнее например, но тем не менее как мне кажется Perl забывать пока точно не стоит.
 
Про минусы - лично мне сложно судить, но многие говорят, что пхп а)не поддерживает многопоточность (разве что мультикурл); б)медленно работает, грузит систему (с этим можно поспорить..); в) вообще существует для разработки сайтов, а не такого софта.

а) В ядре Linux (надеюсь не под Виндой будешь гонять регалки-парсеры?!) нету разделения понятий "поток" и "процесс", как это есть в Windows, каждый "поток" - это отдельный процесс, такой же task_struct как и все остальные. Так что наличие врожденной многопоточности в языке быстродействия не придаст. Часто в PHP-скриптах для многопотоковой обработки по-извратски создают кучу процессов и контролируют их работу через неблокируемые сокеты, однако в PHP есть каноничный pcntl_fork, хотя я сам по правде говоря никогда его не юзал

б) Быстрее всего конечно будет работать софт написанный на С и асме, однако время на разработку и отладку уйдёт несоизмеримо больше. Работа со строками, регулярки, сокеты, курл все это легко в PHP.

в) ну и что? javascript тоже существует для разработки удобного интерфейса, однако никто не гнушается юзать его для эксплуатации уязвимостей браузера.

г) Perl, Python, Delphi - не рассматриваю, т.к. считаю неудобными языки с не С-подобным синтаксисом. C# - Винда.

д) Итого мой вывод - если знаешь PHP, то пиши на нём. А если хочешь поманьячить, пиши на С полчаса то, что в PHP пишется полминуты :)

е) ???!!!

ж) Профит
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем спасибо за ответы.
Ar3s
Если кодинг для себя, и не боты - я бы смотрел, несмотря ни на что, в сторону c#.
Сейчас, как я понимаю, наличие фреймворка - это уже не такая проблема, как раньше?
А какой синтаксис в сишарп, как я понимаю, там не совсем Си, а больше что-то похоже на vb? Или нет?
Но есть старая истина про linux которая дейтвует и в твоем случае - бери тот язык, гуру которого живет ближе всего к тебе.
В таком случае ближе всего Perl)

DASM32
Спасибо за подробное описание. Надо будет посмотреть в сторону Perl, раз такое дело.

Left4Dead
г) Perl, Python, Delphi - не рассматриваю, т.к. считаю неудобными языки с не С-подобным синтаксисом.
Так вроде в Perl С-подобный синтаксис. DASM32 выше писал. Или нет? Не могу понять.

Быстрее всего конечно будет работать софт написанный на С и асме, однако время на разработку и отладку уйдёт несоизмеримо больше. Работа со строками, регулярки, сокеты, курл все это легко в PHP.
Ну в данном случае считаю низкий уровень не актуальным. Это не ддос бот же, тут нет смысла извращаться.

В принципе, если PHP ничем не хуже иных языков, то можно на нем и остановится, просто слышал очень много критики в его адрес, поэтому и решил уточнить.
 
Чтобы сделать выбор, нужно понять какие ты задачи ставишь. Для тех что ты перечислил, парсеры регеры чекеры подойдут абсолютно ВСЕ языки.

Насчет C# не советовал бы, как и JAVA немного для других задач.

1)PHP, отличный язык, куча литературы, доступный
2)Perl, ну язык как раз СИ-подобный, специфичный, и применяется в основном при больших нагрузках и сложных проектах(Яндекс например написан на C+Perl)
3)Python - отличный мощный язык.
4)Delphi - в топку вместе с теми кто на нем пишет.

хотя с считаю что нужно знать хотябы один компилируемый и один интерпритируемый язык. я бы выбрал (C+Perl/C+Python/C+PHP).
 
Пожалуйста, обратите внимание, что пользователь заблокирован
нужно понять какие ты задачи ставишь.
Задачи я расписал в первом посте. Нужна только работа с сетью.
хотя с считаю что нужно знать хотябы один компилируемый и один интерпритируемый язык. я бы выбрал (C+Perl/C+Python/C+PHP).
С компилируемых я более менее знаю Масм, Си слабо, на уровне чтения простых сорцов. Си планировал со временем учить, но больше для малвары, т.к. на нем скорей всего, также неудобно работать с сетью, как и на Масме (проще написать что то вида IdHttp1->Get("site.com") чем объявлять структуру сокета и так далее.
 
Perl, ну язык как раз СИ-подобный, специфичный

С-подобный я имел ввиду такие как Java, PHP. В Перле имхо слишком много нелицеприятной специфики). Пример:
# Write Error log
sub error_logz {
print $_[0];
if(!open(LOG, " >> $file_error_log")) { open(LOG, " > $file_error_log" ); }
open(LOG, " >> $file_error_log");
print LOG $_[0];
close LOG;
exit;
}


# Iframe file
open(CODE, " <$file_iframe" ) or error_logz(" $txt_er Error: Can not open code file: $file_iframe\r\n\r\n");
@CODE = <CODE>;
# Marker my code
my $iframe = "";
foreach(@CODE) {$iframe = "$iframe$_"; }
my $source_iframe = $iframe;
$iframe = "<!-- . -->$iframe<!-- . -->";
print" $txt_i Iframe:\t\t ".length($iframe)." bytes\r\n";
 
Left4Dead
Никто не заставляет писать именно так, приведенный тобой код можно переписать и так:
Код:
# Write Error log
sub error_logz($) {
 my $log_message = $_[0]; 
 print($log_message);
 if(!open(LOG, '>>', $file_error_log))
  {
   open(LOG, '>', $file_error_log); # а файл-то даже по >> создастся
  }
 print LOG ($log_message);
 close(LOG);
 exit();
}

# Iframe file
if (!open(CODE, '<', $file_iframe))
 {
   error_logz(" $txt_er Error: Can not open code file: $file_iframe\r\n\r\n");
 }
while (my $codeline = <CODE>)
 {
   push @iframecode, $codeline;
 }
# Marker my code
my $iframe = '';
foreach my $codeline (@iframecode) 
 {
  $iframe = $iframe.$codeline;
 } 
my $source_iframe = $iframe;
$iframe = '<!-- . -->'.$iframe.'<!-- . -->';
print($txt_i." Iframe:\t\t ".length($iframe)." bytes\r\n");

А можно и так:
Код:
# Write Error log
sub error_logz{
my $m=shift;
open(L, ">>$file_error_log") && do{print($_ $m) foreach (STDOUT, L)} && close L;
exit();
}

# Iframe file
open(CODE, "<$file_iframe") ? do{
my $i='<!-- . -->';
($iframe,$source_iframe)=do{$a=join('',<CODE>);($i.$a.$i, $a)};
print " $txt_i Iframe:\t\t ".length($iframe)." bytes\r\n";
}:(error_logz(" $txt_er Error: Can not open code file: $file_iframe\r\n\r\n"));
 
Я для рутины юзаю пхп. Если дружишь с линуксом, то с потоками проблем не возникнет. По быстродействию с установленным eaccelerator всего лишь в разы медленнее скомпилированнного бинаря (при прочем аналогичном функционале).
По скорости написания с нуля не сравнить с сями конечно - на пыхе все гораздо проще, ибо много уже готового встроено в язык.
 
учи все. :)
есть еще Ruby и много чего еще..

простой пример на трех различных языках
Пример на C#:
Код:
using System;

class Program
{
    static int Main(string[] args)
    {
        uint a = 0xe3c2945d;
        uint b = 0xcd90c663;
        Console.WriteLine("0x{0:X} ", a*b);
        return 0;
   }
}
Результат:
0x804F4DF7
Для продолжения нажмите любую клавишу . . .

Пример на Perl:
Код:
$a = 0xe3c2945d;
$b = 0xcd90c663;
print sprintf("0x%X", $a*$b);
Результат:
0xFFFFFFFF

Пример на Python:
Код:
a = 0xe3c2945d
b = 0xcd90c663
print "0x%X" % (a*b)
Результат:
0xB6E39EC2804F4DF7

Ну и чтобы уже окончательно точку поставить над всеми Ы :)
Пример на Python:
Код:
a = 0x1a936feec2945d29b0
b = 0x29b07c0cd90c66346f
print "0x%X" % (a*b)
Результат:
0x453EF2AF0F8B1C388203CB01DC41CFCD350

Если выбирать что-то одно из предложенного, то выбирай Python и не парься :)
Отступы – это страшилка для начинающих, через неделю уже не будешь обращать на это внимание
Сейчас редакторы кода сами выставляют отступы автоматически, и сразу подсвечивают ошибки синтаксиса :)
Надо их просто сразу настроить правильно, у них обычно для питона отдельные настройки присутствуют
Выстави отступы табами и установи размер таба в 3 пробела – будешь четко все видеть на начальном этапе :)
Я начинал с форума python.su (не знаю, как он там сейчас жив или нет) но очень хороший форум, все только по теме - минимум флейма
Python быстро учится особенно если знаешь еще какой-нибудь ЯП
Python ты можешь заюзать как у себя, так и на "чужом компе"
Python-кода уже написано столько что .net покажется скриптом написанным на коленке по сравнению с мощью Python`а
В аттаче (если прикрепится) пример того что можно сделать на Python+Qt за минут 15
И вот видео еще тоже на Python+Qt написано
http://demonteam.narod.ru/download/devmp.rar
C#(.net) – это абстракция от ахтунгов Microsoft создана для того чтобы переманить на свою сторону начинающих и не дать постоянно пополнять ряды Java (и не более, если что-то серьезное будешь кодить именно на C# толку будет ноль – это 100%)
+
Left4Dead пишет:
C# - Винда
И это даже важнее (применительно к цели сабжа)
Чем
Quake3 пишет:
Но требует фреймворк.
И у C# таже болезнь что и у
Quake3 пишет:
С++ со своими указателями, мильеном типов строк и т.д.

Quake3 пишет:
Язык сильно развивается
Странно, а я думал, он уже давно умер :)
Я "где-то" там слышал про "F#" ;)
Если уж начинать изучать так лучше Java чем C#
Я .net юзаю в качестве макросов к Microsoft Visual Studio и более лучшего применения я ему не нашел
C# хорош для изучения в том плане что четкую дает картину понимания что такое ООП, после C# Delphi изучается очень легко
И кстати это как раз убивает невосприимчивость к отвратительному синтаксису Delphi
Короче как всегда времени мало, а написать хочется больше :)
ЗЫ: ИМХО
 
Пример на Perl:
А ведь нужно-то было всего лишь добавить в начало "use bigint;" (модуль стандартной комплектации) ;)
Разве что с выводом не тра*ался, там скорее всего через pack/unpack надо будет для hex-вида вывода.

Кстати, а ведь для .NET под линухой есть Mono, на простеньких программках на C# пробовали - вполне нормально работает. Никоим образом не за C# и .NET, но хотелось бы сей факт отметить.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я недавно попробовал LWP (Perl), это просто шедевр. Не знаю, как там будет дальше, но пока что для меня пост запросы здесь выглядят наиболее красиво и естественно. И (что очень важно для меня), есть маны, статьи и даже книги (!) по LWP.

Интересно узнать по php - чем кто пользуется для написания такого вот сетевого софта? Просто мне лично ничего так и не подошло на 100%.

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

2. CURL - как я вижу, это стандарт для сетевого софта на пхп. Мне лично курл не понравился вообще, из-за своей неудобности. Может, конечно, я просто не так все понял, или хз, но смотрите: нам надо, допустим, авторизоваться на форуме, получить код страницы, и сделать постинг (использововав токен с исходного кода страницы). В Perl все просто - $ua->post(, урл, данные, заголовки и так далее). В курл, как я понял, надо писать php-функцию на каждое дело (авторизация, постинг). Вида:
function autorize ($url,$login,$pass)
{
и тут дофига curl_setopt_......
}
Далее - постинг в форум, в лс - и опять 25, пишем очередную функцию. В некоторых форумах, если авторизовался 1 курл сеансом, а отпостил другим, то пишет что сессия не та. Короче, не нравится мне курл вообще.

3. Самописные либы, какие-то модули PEAR - может там и есть что-то удобное, аки LWP, но я их не пробовал, поэтому не знаю.
 
Интересно узнать по php - чем кто пользуется для написания такого вот сетевого софта?
Самопальные либы (сокеты). Если припрет на пхп и нужны потоки - включаю в проект курл. Иногда очень полезна связка php+[c/delphi/assembler/блаблабла]. Парсеры, реггеры и прочее спокойно пишется на пыхе.

Сокеты. На них долго и муторно писать
Глупость.

на них сложный спамсофт пишут лишь извращенцы
"Сложный спам софт" на пхп никто не будет писать, разве что для очень специфичных мероприятий. Можно перл погонять конечно, но вообще в таких случаях обычно пишут под винду.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
WennY, можете тогда подсказать мне по сокетам? что я делаю не так. Есть форум phpbb2. Нужно авторизоваться и отправить сообщение. Я не спамер, и у меня есть реализация этого на курл, но хочу сделать на сокетах. Авторизоваться удается, код вот такой

Код:
<?php
$sock = fsockopen("testtest.flyfolder.ru",80,$er1,$er2,30);

$loginstr = "username=givi&password=pass&redirect=&login=%C2%F5%EE%E4";

$out = "POST /login.php HTTP/1.0\r\n";
$out .= "Host: testtest.flyfolder.ru\r\n";
$out .= "Referer: testtest.flyfolder.ru\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($loginstr)."\r\n\r\n";
$out .= $loginstr;

fwrite($sock, $out);

$res = '';
while (!feof($sock))
{
$res .= fgets($sock, 128);
}
fclose($sock);

echo $res;
?>
Тут в принципе все ясно. Далее пробую постинг, пишу такой код
Код:
fclose($sock); //закрываем предыдущий сокет
sleep (1); //небольшая пауза
$sock = fsockopen("testtest.flyfolder.ru",80,$er1,$er2,30); 
$arr=explode('Set-Cookie:',$res); // разбиваем ответ сервера для получения кук
/*тут получается массив вида
0] => HTTP/1.1 302 Moved Temporarily Server: nginx/0.7.65 Date: Sat, 27 Aug 2011 17:28:02 GMT Content-Type: text/html Connection: close
[1] => flbbb2_data=a%3A2%3A%7Bs%3A11%3A%22autologinid%22%3Bs%3A0%3A%22%22%3Bs%3A6%3A%22userid%22%3Bi%3A-1%3B%7D;
и так далее */
Код:
$cook=$arr[1]; //т.к. в массиве под ключем 1 куки, сохраняем их в переменную эту.
$message="sockets test"; //текст сообщения
$sid_str=$arr[4]; //4ая строка того же массива - куки-сид, идентификатор сессии
list ($null, $sid) = explode ("sid=", $sid_str, 2); 
list ($sid, $null) = explode (";", $sid, 2);
/*эти две строки получают "чистый" sid, без лишних слов вида set-cookie */
$pststr = "message=$message&attach_sig=on&sid=$sid&mode=reply&t=16&post=%CE%F2%EF%F0%E0%E2%E8%F2%FC"; //строка для пост запроса, как требует форум.
$out="POST /posting.php HTTP/1.0\r\n";
$out .= "Host: testtest.flyfolder.ru\r\n";
$out .= "Referer: testtest.flyfolder.ru\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1\r\n";
$out .="Cookie: $cook;\r\n"; /* точку с запятой поставил, т.к. были проблемы, на этой строке все зависало */
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: ".strlen($pststr)."\r\n\r\n";
$out .=$pststr;
fwrite($sock,$out);
И не работает.
Сниффер показывает лишь мой запрос, а ответа сервера нет
273e5065f7485065cf86b8da2ef1ded9d60c8e21.png
 
Ну, просто кто-то решил, что обрабатывать ответ от сервера вовсе не обязательно, он сам переварится, спарсится в переменную и выведется на экран.. Добавь в конце

Код:
while (!feof($sock))
{
    echo fgets($sock, 128);
}

и убери одну из идущих подряд команд на закрытие сокета - fclose($sock). А то во втором случае он там воздух закрыть пытается.

P.S. Ты бы не бездумно копипастил чужие наработки, а хоть разбирался немного, чем занимается тот или иной блок
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Спасибо, я действительно не подумал, что надо читать ответ)
P.S. Ты бы не бездумно копипастил чужие наработки, а хоть разбирался немного, чем занимается тот или иной блок
Я не копипастил, практически весь код писал сам (и комменты тоже). Могу объяснить любой участок кода.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх