Schrift
[thread]10931[/thread]

Kommunikation 2er Programme (nicht Kind-Prozess)

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Mates
 2007-11-30 20:55
#103327 #103327
User since
2006-08-15
21 Artikel
BenutzerIn
[default_avatar]
Salü!
Will eine Art Daemon laufen lassen und ihn von einem anderen Programm aus ansprechen.
Dabei sollen die Daten in beide Richtungen geschickt werden.
Allerdings ist dies kein Kind-Prozess, sondern 2 unabhängige Programme.
Habs mit fork und pipe probiert, aber diese laufen ja gerade auf dieses "Programm aufgabeln" hinaus,
was in dem Fall ja nicht das ist was ich brauche.
Was wäre in diesem Fall von Nöten?
renee
 2007-11-30 21:00
#103330 #103330
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie sind die beiden Programme realisiert? Als Client/Server oder zwei völlig unabhängige Programme?

Vielleicht mal bei den CPAN:IPC-Modulen umschauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-11-30 21:01
#103331 #103331
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Das kannst du auch gut mit Sockets machen.
Schau dir mal IO::Socket an.
Gast Gast
 2007-11-30 21:06
#103332 #103332
FiFo (benannte Pipe) gibt es auch noch. (Linux/Unix)
Mates
 2007-11-30 22:42
#103340 #103340
User since
2006-08-15
21 Artikel
BenutzerIn
[default_avatar]
Hoi ging ja fix :-)
Es ist nicht direkt eine Server/ Client-lösung.
Der Daemon ist im Prinzip nur eine Art Taskplaner, der in gewissen Intervallen, unterschiedliche Aufgaben erledigt.
Dieser läuft die ganze Zeit und soll von einem unabhängigen Programm, welches manuell vom User gestartet wird - und auch selbst weitere kleine Programme startet - fernbedient und kontrolliert werden können.
Vereinfacht und zusammengefasst läuft der Daemon in einer Endlosschleife und arbeitet seine Aufgabenlisten ab, welche ich mit dem Programm erweitern/ editieren/ löschen... will.

Meinst du zufällig IPC::Run ?

IO::Socket müsst ich mir genauer angucken.

FiFo? Nur Linux? Sollte schon Win und Linux tauglich sein :-(

Hatte schon die Idee via Datei schreiben, aber es ist weder elegant noch schnell. ;-(

Mit den ProzessIds ( $$ ) kann man nix anfangen?


/edit:
Grr Ich such mich gerad dumm und dämlich, aber google bringt nix gescheites zum Thema IO::Socket :-(
Hat jemand ein einfaches kleines Beispiel eines Servers und Clients?
Kann imo noch nich gut mit den Modulen umgehen :-(
Im Übrigen: Geht IO:Socket in beide Richtungen? Was ich bisher gefunden habe sah nicht so aus ?!?!
styx-cc
 2007-12-01 13:35
#103348 #103348
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Da hast du einen Link zu IO::Socket: http://search.cpan.org/~gbarr/IO-1.2301/IO/Socket....
und ja, es kann in beide Richtungen.

Eine kleines Script, was sich zu nem Server verbindet und mittels Select Daten holt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
sub main_connection {

my $text = shift;#prompt-msg

sleep(30) unless $FST;#provide serverflooding

$FST = 0;

print "$text\n";

$SPIN = shake_hands();

login();

#use select to have a non-blocking socket

my $sock = new IO::Select( $SPIN );

main_loop($sock);

} #sub main_connection



sub main_loop {

my $sock = shift;

my $died = 0;#check flag

while (1) {

#get data from socket, if there some

while ((my @ready = $sock->can_read(30))) {

#print "test1\n";

for my $fh (@ready) {#checkout readable fhs

if($fh == $SPIN) {

my $input;

unless(sysread($SPIN,$input,2048)) { $died = 1 };

last if $died;

if($input) {

#print "test2\n";

ping_check();

#in some cases we've more than one cmd in a line

#so we've to split them by \n, cause server seperates by \n

my @cmds = split /\n/, $input;

for my $line (@cmds) {

open_log() unless check_log("logs/$logfile");

start($line);

#print "test3\n";

}

} else {

print "unknow socketerror...\n";#syswrite returns 1, but we haven't some input?

}

last;

}

}

last if $died;

}

last if $died;

ping_check() or last;

print "Nichts passiert!\n";

}

main_connection('Socketerror, trying to reconnect..');

} #main_loop()

$SPIN ist eine Instanz von IO::Socket
mit
print $SPIN "Data\n";
kannst du dem Server Daten uebermitteln

MfG
edit: fuer die leerzeilen kann ich nichts
Pörl.
murphy
 2007-12-01 15:19
#103351 #103351
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Für das, was Du vorhast, könnte sich auch so etwas wie CPAN:Net::DBus gut eignen.
When C++ is your hammer, every problem looks like your thumb.
Mates
 2007-12-01 22:26
#103366 #103366
User since
2006-08-15
21 Artikel
BenutzerIn
[default_avatar]
Schlag mich tot oO Mit den CPANs kann ich ziemlich wenig anfangen :-(
Aber gut, werd da mal paar Sachen probieren. Mal schaun obs klappt.
Die Beispiele werden mir da vllt weiterhelfen, wobei ich da imo noch mühe habe :D

Ach ja, so nebenbei:
Kann es sein, das Pipe/ fork unter Windows und Linux einwenig verschieden funktionieren? Anfangs gings auf beiden Systemen.
Später als ichs dann mit 3 Kinds probiert habe, gings nimmer.
Aufm Linux Server gings ohne Probleme, nur Windows wollte nicht.
Kann das sein?
Mates
 2007-12-01 23:26
#103372 #103372
User since
2006-08-15
21 Artikel
BenutzerIn
[default_avatar]
Hmm, wenn ich jetzt folgenden Codefetzen für den Clienten benutze, bekomme ich diese Fehlermeldung:

Quote
Bad arg length for Socket::unpack_sockaddr_in, length is 0, should be 16 at C:/Perl/lib/Socket.pm line 373.

bzw.:
Quote
recv: Unknown error at C:\Dokumente und Einstellungen\Operator\Eigene Dateien\Public\Homepage\cgi-bin\iosocketclient.cgi line 18.


Hier der Code:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);
use IO::Socket;

my ( $HOSTNAME, $PORTNO, $MAXLEN, $nachricht );

$HOSTNAME       = '127.0.0.1' ;
$PORTNO         = 5151;
$MAXLEN         = 1024;
$nachricht      = 'Hallo Computer';

socket ( SOCKET, PF_INET , SOCK_DGRAM, getprotobyname ( 'udp' ) ) or die "socket: $!";
my $ipaddr              = inet_aton ( $HOSTNAME );
my $portaddr    = sockaddr_in ( $PORTNO, $ipaddr );

send ( SOCKET, $nachricht , 0, $portaddr ) == length ( $nachricht ) or die "cannot send to $HOSTNAME($PORTNO): $!";
$portaddr               = recv ( SOCKET, $nachricht, $MAXLEN, 0 ) or die "recv: $!";

( $PORTNO, $ipaddr )    = sockaddr_in ( $portaddr );
my $host = gethostbyaddr( $ipaddr, AF_INET );
print "$host($PORTNO) said $nachricht$/";



/edit:
Ok, habs jetzt mal damit probiert:
Server:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use IO::Socket;
my $sock = new IO::Socket::INET (
        LocalHost => '127.0.0.1',
        LocalPort => '7070',
        Proto => 'tcp',
        Listen => 1,
        Reuse => 1,
);
die "Could not create socket: $!\n" unless $sock;

my $new_sock = $sock->accept();
while(<$new_sock>) {
        print $_;
}
close($sock);


Client:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
use IO::Socket;
my $sock = new IO::Socket::INET (
        PeerAddr => '127.0.0.1',
        PeerPort => '7070',
        Proto => 'tcp',
);
die "Could not create socket: $!\n" unless $sock;
print $sock "Hello there!\n";
close($sock);


Die Daten werden soweit erfolgreich geschickt :D
Nur bekomm ich beim Client trotzdem folgende Meldung:
Quote
Could not create socket: Unknown error

Wo liegt das Problem? Ist die Zeile 7 mit dem "die" nicht überflüssig/ falsch??
betterworld
 2007-12-02 00:04
#103374 #103374
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Wenn ich das ausfuehre, kriege ich eine vernuenftige Fehlermeldung:
Code: (dl )
Could not create socket: Connection refused

Weiss nicht, warum da bei Dir "Unknown error" steht. Vielleicht ist das einer dieser Faelle, wo man unter Windows $^E statt (oder zusätzlich zu) $! ausgeben muss oder so.. hast Du unter Windows getestet?

Ueberfluessig ist die Zeile jedenfalls nicht.
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2007-11-30 20:55.