Schrift
[thread]12104[/thread]

Server nimmt keine weiteren Nachrichten an

Leser: 4


<< >> 8 Einträge, 1 Seite
qqonline
 2008-06-30 02:10
#111670 #111670
User since
2008-06-30
1 Artikel
BenutzerIn
[default_avatar]
Hallo!

Habe folgendes Problem:

Ich habe einen TCP Server geschrieben, der auch auf meine Anfragen antwortet. Nur leider nur einmal, danach kann ich ihm senden was ich will und er schickt keine Antwort zurück...

Hoffe ihr könnt mir helfen

Code:

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
#!/usr/bin/perl

use IO::Socket;
use DBI;

my $dbname="Dbname";
my $username="username";
my $pw="pw";

my $data1 = "DBI:mysql:$dbname";
my $data2 = DBI->connect($data1, $username, $pw, { RaiseError => 1 }) || die("Kann MYSQL DB nicht öffnen!");


$server_socket = IO::Socket::INET->new (
LocalPort => 1000,
Listen => 10,
Proto => 'tcp',
Reuse => 1) or die "$@\n";

print "Server lauft, zum Beenden Strg+c eingeben oder Prozess killen\n";
while($client = $server_socket->accept()) {
$client_send = <$client>;
$answer = &antwort($client_send);
print $client "$answer\n";
}

my $leer = " ";

#------------------------------------------------------------------
#Protokoll beginn - ABFRAGEN , BEFEHLE etc.

sub antwort{
print $_[0];

($i1, $i2, $i3)=split($leer,$_[0]);

#Verbindungsabfrage
if($i1." ".$i2 eq "sicherheitscode connect_request\r\n") {
"connect_ok";
}

#abfrage
if($i1." ".$i2 eq "sicherheitscode get_channelliste\r\n") {

my $sql="SELECT * FROM test ORDER BY nick DESC";
my $abfr1=$data2->prepare($sql);
$abfr1->execute;
while (@ergebnis = $abfr1->fetchrow_array)
{
$ausgabeaussql .= $ergebnis[0].",";
}

print $ausgabeaussql;
return "send_channelliste|sdfgsdfgsdfgsdfg".$channelliste;
}
}
moritz
 2008-06-30 02:19
#111671 #111671
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
qqonline+2008-06-30 00:10:28--
Hallo!

Habe folgendes Problem:


Du benutzt weder 'use strict;' noch 'use warnings;' Ausserdem ist die Einrückung deines Codes grauenhaft, was ihn sehr schwer lesbar macht.

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $leer = " ";

#------------------------------------------------------------------
#Protokoll beginn - ABFRAGEN , BEFEHLE etc.

sub antwort{
print $_[0];

($i1, $i2, $i3)=split($leer,$_[0]);

#Verbindungsabfrage
if($i1." ".$i2 eq "sicherheitscode connect_request\r\n") {
"connect_ok";
}


Diese Bedingung wird nie wahr sein, weil split " ", $string alle Art von Leerzeichen Entfernt, da wird nie ein "\r\n" drin sein. Ausserdem ist der Body der If-Abfrage ziemlich sinnlos, das ist nur ein string, mit dem nichts passiert.
murphy
 2008-06-30 02:40
#111672 #111672
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Dein Server liest von jeder akzeptierten Verbindung genau einen Befehl, wertet ihn aus und lässt dann den Dateideskriptor offen, bis eine neue Verbindung ankommt.

Das ist ein ziemlich merkwürdiges Verhalten für einen TCP-Server.

Üblicher wäre es, für jede akzeptierte Verbindung einen Thread oder Prozess zu starten, der dann beliebig viele Befehle in einer Schleife verarbeitet. Wenn man parallele Programmabläufe vermeiden will, kann man auch über Eingabedatenströme und neue Verbindungsanfragen auf dem Serversocket mittels select multiplexen.
When C++ is your hammer, every problem looks like your thumb.
Hagen
 2008-06-30 11:38
#111674 #111674
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Hatte mal vor einiger Zeit diesen "Perl-Server" gefunden. Vielleicht findest du ja dort noch ein paar Anregungen.
Gruß
Hagen
Gast Gast
 2008-07-22 01:41
#112417 #112417
Vielen Dank!

Hat mir sehr weitergeholfen!

Nun habe ich ein anderes Problem...

Wenn ich über den server etwas sende via print $client "nachricht" schickt er es nur an einen clienten... jedoch soll er es an alle verbundenen schicken :(

habt ihr eine lösung?
nepos
 2008-07-22 02:50
#112421 #112421
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dafür brauchst du für jeden Client einen eigenen Socket. Hast du das denn?
Oder beschreib doch mal genauer, was dein Server wie genau machen soll.
Gast Gast
 2008-07-22 03:02
#112423 #112423
Hallo,

Habe folgenden Code nun am Anfang, da ( wie oben beschrieben ) er nur eine Nachricht entgegen nahm :)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...


use constant MYPORT => 9810;
$sock = new IO::Socket::INET(LocalPort => MYPORT,
Reuse => 1,
Listen => 5)
or die "can't create local socket: $@\n";

print "Server lauft, zum Beenden Strg+c eingeben oder Prozess killen\n";

while ($client = $sock->accept()) {

print "Accepting connections on Port ", MYPORT, "...\n";
print "Accepted connection from ",
$client->peerhost(), ":", $client->peerport(), "\n";

if (fork() == 0) {

while (<$client>) {

... meine abfragen für bestimmte befehle (server antwortet z.B. mit uptime etc.)


Er soll eine Nachricht, die er empfängt an alle verbundenen Clienten senden :)
Gast Gast
 2008-07-25 21:27
#112762 #112762
Hat denn keiner eine Lösung? :(
<< >> 8 Einträge, 1 Seite



View all threads created 2008-06-30 02:10.