<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TheFox &#187; ActivePerl</title>
	<atom:link href="http://fox21.at/tag/activeperl/feed" rel="self" type="application/rss+xml" />
	<link>http://fox21.at</link>
	<description>Just another Perl hacker.</description>
	<lastBuildDate>Sun, 06 May 2012 14:22:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Windows Hintergrundprozess mit Perl</title>
		<link>http://fox21.at/windows-hintergrundprozess-mit-perl.html</link>
		<comments>http://fox21.at/windows-hintergrundprozess-mit-perl.html#comments</comments>
		<pubDate>Fri, 30 Jan 2009 12:17:51 +0000</pubDate>
		<dc:creator>TheFox</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[ActivePerl]]></category>
		<category><![CDATA[Daemon::Easy]]></category>
		<category><![CDATA[ERROR]]></category>
		<category><![CDATA[POSIX]]></category>
		<category><![CDATA[Proc::Background]]></category>
		<category><![CDATA[Prozess]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Win32::Console]]></category>
		<category><![CDATA[Win32::Process]]></category>
		<category><![CDATA[Working::Daemon]]></category>

		<guid isPermaLink="false">http://cms.fox21.at/nocache/?p=605</guid>
		<description><![CDATA[Ein Perl-Script unter Windows im Hintergrund rennen zu lassen waere schon etwas feines, dachte ich mir. Aber Windoof laesst keine Hintergrundprozesse zu, wird das jeweilige Programm (in dem Fall perl.exe) von der Commandline ausgefuehrt. Ich hab&#8217;s mit allen moeglichen Tricks &#8230; <a href="http://fox21.at/windows-hintergrundprozess-mit-perl.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ein Perl-Script unter Windows im Hintergrund rennen zu lassen waere schon etwas feines, dachte ich mir. Aber Win<strong>doof</strong> laesst keine Hintergrundprozesse zu, wird das jeweilige Programm (in dem Fall perl.exe) von der Commandline ausgefuehrt.</p>
<p><span id="more-605"></span></p>
<p>Ich hab&#8217;s mit allen moeglichen Tricks probiert. STDIN, STDOUT und STDERR nach nul (unter Windows nur mit einem L) umleiten, <em>fork()</em>, von einem anderen Script aus mit <em>open</em> eine Pipe oeffnen, mit <em>cmd.exe /C</em> und mit <em>start /B</em>. Und auch all&#8217; diese verschiedenen Moeglichkeiten kombiniert. Aber nichts funktioniert. Ich kann mich an <strong>Visual Basic</strong> erinnern. Sogar <strong>das</strong> kann Prozesse komplett im Hintergrund starten. Aber es liegt nicht an Perl, dass die Windows Commandline so <span style="text-decoration: line-through;">beschissen</span> ist. Das zeigt, dass die Linux Shell sehr maechtig ist. Wofuer gibt es dann unter Windows eigentlich cmd.exe, wenn sie nichts kann? Das ist wie der Blinddarm im menschlichen Koerper. Es muss doch eine Moeglichkeit geben, um ganz einfach einen Prozess im Hintergrund rennen zu lassen. Ich will nicht extra Module installieren muessen, nur um dieses Problem zu loesen. Selber schuld, wieso verwend&#8217; ich auch Windows?</p>
<p>Schliesslich blieb mir doch nichts anderes ueber, als ein vorhandenes Perl-Modul fuer diesen Job zu installieren. Jedoch bevor ich ein passendes Modul gefunden hatte, probierte ich folgende Module aus: <a target="_blank" href="http://search.cpan.org/perldoc?Daemon::Easy" target="_blank">Daemon::Easy</a>, <a target="_blank" href="http://search.cpan.org/perldoc?Working::Daemon" target="_blank">Working::Daemon</a>, <a target="_blank" href="http://search.cpan.org/perldoc?Win32::Console" target="_blank">Win32::Console</a> und <a target="_blank" href="http://search.cpan.org/perldoc?Proc::Background" target="_blank">Proc::Background</a>. Alle haben eines gemeinsam: <a target="_blank" href="http://search.cpan.org/perldoc?POSIX" target="_blank">POSIX::setsid()</a>. <em>ERROR: POSIX::setsid not implemented on this architecture</em>. Will man setsid() unter Windows XP verwenden, wird diese Fehlermeldung angezeigt. <a target="_blank" href="http://search.cpan.org/perldoc?Win32::Process" target="_blank">Win32::Process</a> war dann schliesslich des Raetels Loesung. Die anderen Module starten zwar auch einen Prozess im Hintergrund, aber sobald cmd.exe beendet wird, werden auch alle anderen Prozesse beendet, die ueber diese Console gestartet worden sind. Win32::Process startet naemlich einen richtigen Hintergrundprozess, vorausgesetzt das cFlag ist DETACHED_PROCESS.</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Win32<span style="color: #339933;">::</span><span style="color: #006600;">Process</span><span style="color: #339933;">;</span>
Win32<span style="color: #339933;">::</span><span style="color: #006600;">Process</span><span style="color: #339933;">::</span><span style="color: #006600;">Create</span><span style="color: #009900;">&#40;</span>
	<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$proc</span><span style="color: #339933;">,</span>
	<span style="color: #0000ff;">$^X</span><span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'perl run.pl'</span><span style="color: #339933;">,</span>
	<span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
	DETACHED_PROCESS<span style="color: #339933;">,</span>
	<span style="color: #ff0000;">'.'</span>
<span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;Win32::Process::Create failed<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<h2><strong>Benoetigte Perl-Module</strong></h2>
<ul>
<li>File::Basename</li>
<li>Win32::Process</li>
</ul>
<h2><strong>Download</strong></h2>
<ul>
<li> <a target="_blank" href="http://software.fox21.at/windaemon/releases/windaemon-1.1.0.zip">windaemon-1.1.0.zip</a></li>
<li><del datetime="2009-03-24T19:44:14+00:00"><a target="_blank" href="http://software.fox21.at/windaemon/releases/windaemon-1.0.0.zip">windaemon-1.0.0.zip</a></del></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fox21.at/windows-hintergrundprozess-mit-perl.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TCP/UDP Pipe 1.0.0</title>
		<link>http://fox21.at/tcp-udp-pipe-bridge-proxy-100.html</link>
		<comments>http://fox21.at/tcp-udp-pipe-bridge-proxy-100.html#comments</comments>
		<pubDate>Sat, 17 Jan 2009 21:21:35 +0000</pubDate>
		<dc:creator>TheFox</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[ActivePerl]]></category>
		<category><![CDATA[Bridge]]></category>
		<category><![CDATA[Client]]></category>
		<category><![CDATA[IO::Select]]></category>
		<category><![CDATA[IO::Socket::INET]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Netcat]]></category>
		<category><![CDATA[Pipe]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[TCP]]></category>
		<category><![CDATA[UDP]]></category>

		<guid isPermaLink="false">http://fox21.at/?p=370</guid>
		<description><![CDATA[Es gibt kein Problem, das man nicht mit Perl loesen koennte. TCP/UDP Pipe ist ein Perl Script, dass zwischen einem Server und einem Clienten eine Verbindung herstellt. Aehnlich wie bei Netcat, einem Proxy oder einem TCP-Tunnel. Man kann damit nicht &#8230; <a href="http://fox21.at/tcp-udp-pipe-bridge-proxy-100.html">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Es gibt kein Problem, das man nicht mit Perl loesen koennte. TCP/UDP Pipe ist ein Perl Script, dass zwischen einem Server und einem Clienten eine Verbindung herstellt. Aehnlich wie bei <a target="_blank" href="http://netcat.sourceforge.net/" target="_blank">Netcat</a>, einem Proxy oder einem TCP-Tunnel. Man kann damit nicht nur eine TCP zu TCP und UDP zu UDP Verbindung betreiben, sondern auch UDP zu TCP und TCP zu UDP.</p>
<p><span id="more-370"></span></p>
<p>Wobei UDP zu TCP und TCP zu UDP nicht so reibungslos funktioniert wie zwei Verbindungen der gleichen Art. Natuerlich koennen auch mehrere Verbindungen gleichzeitig mit ein und dem selben Server hergestellt werden. Wenn sich ein neuer Client verbindet, wird dafuer ein eigener <a target="_blank" href="http://search.cpan.org/perldoc?IO::Socket::INET" target="_blank">Socket</a> erstellt. In der <strong>tcppipe.conf</strong> Datei, die auch in der zip-Datei enthalten ist, befindet sich ein Beispiel zum Testen. Wenn man die conf-Datei unveraendert laesst und tcppipe.pl startet, wird am lokalen Computer ein TCP Server auf Port <strong>2102</strong> erstellt. Wenn man dann mit dem Browser auf <a target="_blank" href="http://localhost:2102/" target="_blank">http://localhost:2102/</a> schaut, wird man feststellen, dass <a target="_blank" href="http://fox21.at/" target="_blank">meine Seite</a> erscheint. Die Anfragen an <strong>localhost:2102</strong> werden also auf <strong>fox21.at:80</strong> weitergeleitet. Die Konfigurationsdatei (tcppipe.conf) kann man natuerlich beliebig anpassen. Wenn <em>localhost</em> (= 127.0.0.1, <a target="_blank" href="http://de.wikipedia.org/wiki/Loopback" target="_blank">Loopback</a>) fuer den lokalen Server verwendet wird, dann kann man nur vom selben Computer darauf zugreifen. Nicht aber von einem Anderen. Wenn von jedem Computer im Netzwerk darauf zugegriffen werden darf, muss man fuer die lokale <a target="_blank" href="http://de.wikipedia.org/wiki/Internet_Protocol" target="_blank">IP-Adresse</a> z.B. <em>192.168.241.21</em> verwenden. Kommt darauf an, welche IP-Adresse der Computer im Netzwerk hat. Verwendet man <em>0.0.0.0</em> als lokale IP-Adresse fuer den Server, so wird auf allen Interfaces gelauscht (<em>LISTEN</em>). Dieses Script funktioniert auch mit ActivePerl. Es benoetigt die Module <a target="_blank" href="http://search.cpan.org/perldoc?IO::Select" target="_blank">IO::Select</a>, <a target="_blank" href="http://search.cpan.org/perldoc?IO::Socket::INET" target="_blank">IO::Socket::INET</a> und <a target="_blank" href="http://search.cpan.org/perldoc?Time::HiRes" target="_blank">Time::HiRes</a>.</p>
<h2><strong>Benoetigte Perl-Module</strong></h2>
<ul>
<li>IO::Select</li>
<li>IO::Socket::INET</li>
<li>Time::HiRes</li>
</ul>
<h2><strong>Konfiguration</strong></h2>
<ul>
<li>Jeder <em>server</em>-Block muss einen <em>client</em>-Block enthalten.</li>
<li>Die <em>ip</em>, egal ob im server- oder im client-Block muss folgendes Format haben: <strong>host:port</strong></li>
</ul>
<h2><strong>Flags</strong></h2>
<p>Hier ist eine Liste mit den Bedeutungen des <em>flags</em>-Feldes, das in jedem <em>server</em>- und <em>client</em>-Block vorkommen sollte:</p>
<ul>
<li><em>a</em> = active: Wenn kein <em>a</em> vorkommt, wird der Server nicht erstellt. Damit kann man ganz einfach den Server ein- und ausschalten. Natuerlich wird dann auch kein Client erstellt. Was das <em>a</em> im Client-Block ueberfluessig macht.</li>
<li><em>t</em> oder <em>u</em>: TCP oder UDP. Das <em>t</em> steht fuer <strong>T</strong>CP und das <em>u</em> fuer <strong>U</strong>DP. Schreibt man beides in das gleiche flags-Feld, so wird TCP verwendet.</li>
<li><em>s</em>, <em>c</em> oder <em>l</em> = server, client und lokal client: Jeder Server hat intern eine s-Flag und jeder Client ein c-Flag. Cienten, die zum lokalen Server verbunden sind, haben ein l-Flag (kleines L). Diese 3 Flags sind jedoch fuer die Konfigurationsdatei unwichtig, da sie nur intern in der Funktion <em>parseConfig</em> vergeben werden. Und natuerlich auch, wenn ein neuer Socket erstellt wird.</li>
</ul>
<h2><strong>Download</strong></h2>
<ul>
<li><a target="_blank" href="http://software.fox21.at/tcppipe/releases/tcppipe-1.0.0.zip">tcppipe-1.0.0.zip</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://fox21.at/tcp-udp-pipe-bridge-proxy-100.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

