Schrift
[thread]6878[/thread]

filehandle an thread übergeben (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten
Froschpopo
 2005-04-09 03:06
#53655 #53655
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was heißt denn für dich mehrfach nutzen?

ginge denn:
Code: (dl )
1
2
3
    while (<$socket>) {
print $socket "Antwort\n"
}


??????
meinst du mehrfach in mehreren threads oder meintest du vielleicht, dass sie nicht gleichzeitig hören und schreiben können ?
esskar
 2005-04-09 03:16
#53656 #53656
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
okay: starte mal den server von Wiki:Wie erstelle ich eine einfache nicht-blockende Server-Anwendung?
und lass nebenbei folgendes script laufen!

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
use strict;
use warnings;
$|++;

use IO::Socket::INET;
use IO::Select;
use threads;

use constant EXTERNADDR => '127.0.0.1';
use constant EXTERNPORT => 2005;
use constant INTERNADDR => '127.0.0.1';
use constant INTERNPORT => 4711;


sub thread_proc {
my $externsocket = IO::Socket::INET->new(
PeerAddr => EXTERNADDR,
PeerPort => EXTERNPORT,
Type => SOCK_STREAM,
Proto => "tcp"
) or die "Could not connect to external server : $@\n";

$externsocket->autoflush(1);

my $internsocket = IO::Socket::INET->new(
PeerAddr => INTERNADDR,
PeerPort => INTERNPORT,
Type => SOCK_STREAM,
Proto => "tcp"
) or die "Could not connect to internal server : $@\n";

$internsocket->autoflush(1);

my $select = IO::Select->new;

$select->add($externsocket);
$select->add($internsocket);

print "Wait for readable socket\n";
while(my @handles = $select->can_read) {
foreach my $handle (@handles) {
my $line = $handle->getline;

if(defined $line) {
$line =~ s!\r?\n$!!g;
if($handle == $internsocket) { # dad talks to us
$externsocket->print("$line\n"); # send everything to the external server
} elsif($handle == $externsocket) { # response from the server
print "Server Reply: [$line]\n";
}
} else { # socket closed from
$select->remove($handle);
$handle->close;
}
}
}

return (1);
}

my $internserver = IO::Socket::INET->new(
LocalAddr => INTERNADDR,
LocalPort => INTERNPORT,
type => SOCK_STREAM,
Reuse => 1,
Listen => 10
) or die "Could not create TCP server socket : $@\n";

$internserver->autoflush(1);

my $t = threads->create(\&thread_proc);

if(my $socket = $internserver->accept) { # wait for the thread
print "Thread connected\n";

for my $i (0 .. 9) {
$socket->print("Message #$i\n");
sleep(1);
}

$socket->print("quit\n");
$socket->close;

$internserver->close;
}

$t->join; # wait for thread to finish


HTH\n\n

<!--EDIT|esskar|1113002477-->
esskar
 2005-04-09 03:31
#53657 #53657
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Froschpopo
 2005-04-09 04:30
#53658 #53658
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
danke esskar... aber eine Frage hab ich noch...
wenn eine socket nicht gleichzeitig lesen und schreiben kann, warum funktioniert dann das hier:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl


use IO::Socket;

my $server = IO::Socket::INET->new(
    LocalPort => 2006,
    type => SOCK_STREAM,
    Reuse => 1,
    Listen => 10
) or die "Kann nicht an 2006 lauschen\n";

while ($client = $server->accept()) {
    print $client "$client ist die neue Verbindung\n";
}

print "Keine Reaktion";
close($server);


wie man an dem funktionsfähigen Script sehen kann, brauche ich kein neues Socket zu öffnen um eine Nachricht an den Client zurückzuschicken.\n\n

<!--EDIT|Froschpopo|1113006948-->
esskar
 2005-04-09 05:27
#53659 #53659
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versteh deine frage nicht; aber mach doch einfach wie du denkst! ist ja eh immer richtig. aber wunder dich später nicht, dass wieder was nicht funzt! over and out!
Froschpopo
 2005-04-09 06:00
#53660 #53660
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
naja, sri meinte, dass ich nicht einen Socket mehrfach nutzen kann... Aber ich kann ja schreiben und lesen gleichzeitig ! Siehe meinen letzten Post !
esskar
 2005-04-09 06:36
#53661 #53661
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich seh zwar nicht, wo du in deinem letzten post vom socket liest, aber man kann einen socket immer beschreiben und lesen!
Froschpopo
 2005-04-09 07:13
#53662 #53662
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
der server ist so konstruiert, dass er generell zu jeder Anfrage eine Antwort sendet.
hier der Client:
Code: (dl )
1
2
3
4
5
6
print $input "erste Frage an den Server\n";

while(<$input>) {
print "Antwort vom Server: $_\n";
print $input "Zweite Frage an den Server\n";
}

Zur ersten Frage bekommt der Client ne Antwort. Aber die Zweite frage geht irgendwie nicht rüber. Ist das vom Syntax her Ok ?
esskar
 2005-04-09 15:27
#53663 #53663
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mach es doch so, wie ich es vorgeschlagen hab!
Froschpopo
 2005-04-09 16:32
#53664 #53664
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
mach ich ja auch, aber mich interessiert warum es nicht klappt !
<< |< 1 2 3 >| >> 21 Einträge, 3 Seiten



View all threads created 2005-04-08 21:38.