Schrift
[thread]10895[/thread]

was ist an der syntax falsch?? (Seite 6)

Leser: 1


<< |< 1 ... 3 4 5 6 7 >| >> 62 Einträge, 7 Seiten
nepos
 2007-11-26 18:57
#103076 #103076
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hatten wir eigentlich schon ein paar Postings vorher geklärt, dass das so nicht geht ;)
grey1987
 2007-11-27 09:39
#103091 #103091
User since
2007-11-21
83 Artikel
BenutzerIn
[default_avatar]
tut mir leid wenn ich nerve, aber hier noch mal die ergebnisse:
bei diesem code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub getlinefromsocket{
  my $buffer;
  my $char;
  my $max_buf_size = 3;
  while ( $socket->recv( $char, 1) ) {
    last if ( $char eq ' ' );
    $buffer .= $char;
    last if ( length $buffer == $max_buf_size );
    print $char;
  }
}

dieses ergebnis:
Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
AC
Sende ein CONNECT zum Server
A
Sende ein DISCONNECT zum Server
K
Sende ein END SESSION zum Server
CK


bei diesem code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub getlinefromsocket{
  my $buffer;
  my $char;
  my $max_buf_size = 5;
  while ( $socket->recv( $char, 1) ) {
    last if ( $char eq ' ' );
    $buffer .= $char;
    last if ( length $buffer == $max_buf_size );
    print $char;
  }
}

dieses ergebnis:
Code: (dl )
1
2
Sende ein Client Create zum Server
...

und es tut sich nichts.

und bei diesem code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub getlinefromsocket{
  my $buffer;
  my $char;
  my $max_buf_size = 4;
  while ( $socket->recv( $char, 1) ) {
    last if ( $char eq ' ' );
    $buffer .= $char;
    last if ( length $buffer == $max_buf_size );
    print $char;
  }
}

dieses ergebnis:
Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
ACK
Sende ein CONNECT zum Server
ACK
Sende ein DISCONNECT zum Server
ACK
Sende ein END SESSION zum Server
ACK

an sich wäre es ja schön und gut, aber es könnte ja auch ein NACK zurück kommen, und dann wäre wieder alles durcheinander.

kann man dieses problem irgendwie lösen?
grey1987
 2007-11-27 10:21
#103093 #103093
User since
2007-11-21
83 Artikel
BenutzerIn
[default_avatar]
ok ok, anscheinend ist die aufgabe nicht in perl lösbar.


hab jetzt aber noch ne andere frage.

wenn ich jetzt in meinem code ein if-Abfrage machen will:
nach dem hier

Code (perl): (dl )
1
2
3
4
5
getlinefromsocket ($socket);
#hier soll die Abfrage stehen
#zb.
#if (???? eq "ACK")
# mach das und das....

was geb ich denn jetzt bei den Fragezeichen ein??
Linuxer
 2007-11-27 10:54
#103095 #103095
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
grey1987+2007-11-27 09:21:23--
ok ok, anscheinend ist die aufgabe nicht in perl lösbar.


Diese Aussage bezweifel ich. Aber mir wird aus Deinen Beiträgen nicht wirklich klar, wo jetzt letzten Endes Dein Problem liegt. Ein klares Defizit scheint mir im logischen Ablauf vorzuliegen. Aber da ich Dein Problem kaum erkenne und keinen passenden Server zur Hand habe, kann ich momentan auch nichts nachvollziehen. Nur weil Du es mit Perl nicht hinbekommst, heisst das nicht, das Perl das nicht kann.



grey1987+2007-11-27 09:21:23--
hab jetzt aber noch ne andere frage.

wenn ich jetzt in meinem code ein if-Abfrage machen will:
nach dem hier

Code (perl): (dl )
1
2
3
4
5
getlinefromsocket ($socket);
#hier soll die Abfrage stehen
#zb.
#if (???? eq "ACK")
# mach das und das....

was geb ich denn jetzt bei den Fragezeichen ein??


Wo speichert getlinefromsocket() denn die gelesenen Daten? In $buffer, oder nicht. Was machst Du am Ende mit $buffer? Nichts. Also wird $buffer entsorgt und der Inhalt von $buffer geht verloren (da $buffer innerhalb der Subroutine definiert wurde).

Sauberer wäre z.B.:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub getlinefromsocket {
   my $socket = shift;
   my $buffer, $char;

   my $max_buf_size = 3;

   # tu was mit $buffer
   while ( $socket->recv( $char, 1 ) ) {
      last if ( $char eq ' ' );
      $buffer .= $char;
      last if ( length $buffer == $max_buf_size );
      # wenn mit last die Schleife verlassen wird, wird das print nicht ausgeführt!
      print $char;
   }

   # reiche den gefüllten Buffer weiter
   return $buffer;
}


Im restlichen Code kannst Du es dann so benutzen:
Code (perl): (dl )
1
2
3
4
5
my $line = getlinefromsocket( $socket );

if ( $line eq 'ACK' ) {
   #tu was
}

meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
grey1987
 2007-11-27 11:26
#103097 #103097
User since
2007-11-21
83 Artikel
BenutzerIn
[default_avatar]
ich bin nur auf die aussage von nepos eingegangen

"Hatten wir eigentlich schon ein paar Postings vorher geklärt, dass das so nicht geht ;) "

war jetzt nicht böse gemeint oder so.



muss man denn dieses


Code (perl): (dl )
my $max_buf_size = 3;

unbedingt angeben?

bzw kann man das nicht noch umschreiben.

ich hab irgendwie die aufgabe bekommen, dass die whileschleife so lange laufen soll, bis kein zeichen mehr kommt.
und die if-abfrage funktioniert so auch nicht.

hier mein 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
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
use IO::Socket;
use strict;

my $socket = new IO::Socket::INET (PeerAddr =>'PC110197',PeerPort => 1810) or die "Konnte Socket nicht erstellen: $!\n";
$socket->autoflush(1);
my $ausgabe;

print "Sende ein Client Create zum Server\n";
print $socket "CLIENT CREATE\n";
my $line = getlinefromsocket ($socket);
if ($line eq 'ACK') {
  print "es geht!";
}
elsif ($line eq 'NACK') {
  print "geht nicht!";
}
else {
  print "geht nix!";
}

print "\nSende ein CONNECT zum Server\n";
print $socket "CONNECT\n";
my $line = getlinefromsocket ($socket);
if ($line eq 'ACK') {
  print "es geht!";
}
elsif ($line eq 'NACK') {
  print "geht nicht!";
}
else {
  print "geht nix!";
}

print "\nSende ein DISCONNECT zum Server\n";
print $socket "DISCONNECT\n";
my $line = getlinefromsocket ($socket);
if ($line eq 'ACK') {
  print "es geht!";
}
elsif ($line eq 'NACK') {
  print "geht nicht!";
}
else {
  print "geht nix!";
}

print "\nSende ein END SESSION zum Server\n";
print $socket "END SESSION\n";
my $line = getlinefromsocket ($socket);
if ($line eq 'ACK') {
  print "es geht!";
}
elsif ($line eq 'NACK') {
  print "geht nicht!";
}
else {
  print "geht nix!";
}


$socket->close();

sub getlinefromsocket {
   my $socket = shift;
   my $buffer;
   my $char;
   my $max_buf_size = 3;
   while ( $socket->recv( $char, 1 ) ) {
      last if ( $char eq ' ' );
      $buffer .= $char;
      last if ( length $buffer == $max_buf_size );
#      print $char;
   }
   return $buffer;
}

Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
es geht!
Sende ein CONNECT zum Server
es geht!
Sende ein DISCONNECT zum Server
es geht!
Sende ein END SESSION zum Server
es geht!


Aber wenn ich jetzt anstatt CONNECT -> CONECT eingebe (kommt kein ACK, sondern ein NACK), passiert folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
es geht!
Sende ein CONNECT zum Server
geht nix!
Sende ein DISCONNECT zum Server
geht nix!
Sende ein END SESSION zum Server
es geht!


es müsste aber anstatt "geht nix" -> "geht nicht" heißen.

das liegt daran, dass ich die 3 bei max_buf_size angeben muss.
und wenn ich da 4 angebe, dann stimmt das mit dem ACK nicht mehr.

siehe folgende ausgabe:
Code (perl): (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
geht nix!
Sende ein CONNECT zum Server
geht nicht!
Sende ein DISCONNECT zum Server
geht nix!
Sende ein END SESSION zum Server
geht nix!


wie kann man das denn beheben?
pq
 2007-11-27 11:27
#103098 #103098
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
grey1987+2007-11-27 09:21:23--
ok ok, anscheinend ist die aufgabe nicht in perl lösbar.

wenn du noch nicht mal weisst, wie man parameter an subroutinen übergibt und sich zurückgeben
lässt und du noch nicht mal aus der doku perlsub schlau wirst, dann hast du einfach noch
grundlegende defizite in der programmierung, und dir wird es in jeder sprache so gehn.
lösbar ist in perl fast alles.
entweder du lässt dir das programm hier weiter stück für stück zusammenbasteln (solange die
leute noch mitmachen) oder du kaufst dir ein gutes buch, aber die sprache dafür verantwortlich
zu machen, dass dir die grundlagen fehlen...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
grey1987
 2007-11-27 11:48
#103099 #103099
User since
2007-11-21
83 Artikel
BenutzerIn
[default_avatar]
ok ich differenzier mal mein problem:
ohne if abfrage.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use IO::Socket;
use strict;

my $socket = new IO::Socket::INET (PeerAddr =>'PC110197',PeerPort => 1810) or die "Konnte Socket nicht erstellen: $!\n";
$socket->autoflush(1);

print "Sende ein Client Create zum Server\n";
print $socket "CLIENT CREATE\n";
getlinefromsocket ($socket);


print "\nSende ein CONNECT zum Server\n";
print $socket "CONNECT\n";
getlinefromsocket ($socket);


print "\nSende ein DISCONNECT zum Server\n";
print $socket "DISCONNECT\n";
getlinefromsocket ($socket);


print "\nSende ein END SESSION zum Server\n";
print $socket "END SESSION\n";
getlinefromsocket ($socket);

$socket->close();

sub getlinefromsocket {
   my $socket = shift;
   my $buffer;
   my $char;
   my $max_buf_size =4;
   while ( $socket->recv( $char, 1 ) ) {
      last if ( $char eq ' ' );
      $buffer .= $char;
      last if ( length $buffer == $max_buf_size );
      print $char;
   }
   return $buffer;
}

Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
ACK
Sende ein CONNECT zum Server
ACK
Sende ein DISCONNECT zum Server
ACK
Sende ein END SESSION zum Server
ACK

schön und gut
aaaaaaaaber

bei diesem code: (anstatt CONNECT -> CONECT) (und dadurch wird anstatt ACK -> NACK ausgegeben)
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use IO::Socket;
use strict;

my $socket = new IO::Socket::INET (PeerAddr =>'PC110197',PeerPort => 1810) or die "Konnte Socket nicht erstellen: $!\n";
$socket->autoflush(1);

print "Sende ein Client Create zum Server\n";
print $socket "CLIENT CREATE\n";
getlinefromsocket ($socket);


print "\nSende ein CONNECT zum Server\n";
print $socket "CONECT\n";
getlinefromsocket ($socket);


print "\nSende ein DISCONNECT zum Server\n";
print $socket "DISCONNECT\n";
getlinefromsocket ($socket);


print "\nSende ein END SESSION zum Server\n";
print $socket "END SESSION\n";
getlinefromsocket ($socket);

$socket->close();

sub getlinefromsocket {
   my $socket = shift;
   my $buffer;
   my $char;
   my $max_buf_size =4;
   while ( $socket->recv( $char, 1 ) ) {
      last if ( $char eq ' ' );
      $buffer .= $char;
      last if ( length $buffer == $max_buf_size );
      print $char;
   }
   return $buffer;
}

Code: (dl )
1
2
3
4
5
6
7
8
Sende ein Client Create zum Server
ACK
Sende ein CONNECT zum Server
NAC
Sende ein DISCONNECT zum Server
AC
Sende ein END SESSION zum Server
AC

da fehlen jetzt ein paar zeichen... wie man sieht


kann man das beheben?
Linuxer
 2007-11-27 12:36
#103105 #103105
User since
2006-01-27
3871 Artikel
HausmeisterIn

user image
Bei $max_buf_size == 3 wird NACK nicht komplett gelesen, sondern nur "NAC"...
Das if/elsif/else Konstrukt arbeitet korrekt.

Gibt es denn nach dem ACK oder NACK kein Steuerzeichen, dass kennzeichnet, dass diese Übertragung beendet ist? Irgendwie muss doch vom Server deutlich gemacht werden, dass die Status-Meldung beendet ist.

Vielleicht hilft das hier als Ansatz weiter:

Code (perl): (dl )
1
2
3
4
5
6
while ( $socket->recv( $char, 1 ) ) {
   # Abbruch wenn das gelesene ein Whitespace-Zeichen ist: Zeichenklasse [\ \t\r\n\f]
   # also Leerzeichen, Tab, Umbruch, vert. Tab
   last if ( $char =~ m/^\s$/ );
   $buffer += $char;
}


Ansonsten müsste man die Server-Doku konsultieren, wie die Statusmeldungen formatiert sind. Oder man schneidet den Netzwerkverkehr mal mit und schaut nach, was in den Paketen drinsteht...
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
grey1987
 2007-11-27 12:48
#103107 #103107
User since
2007-11-21
83 Artikel
BenutzerIn
[default_avatar]
ich würd den netzwerverkehr gern mitscheneiden und das dann hier posten,

muss nur noch wissen wie das geht..?
renee
 2007-11-27 12:53
#103108 #103108
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Probier mal:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
sub getlinefromsocket {
   my $socket = shift;
   my $buffer;
   my $char;
   while ( $socket->recv( $char, 1 ) ) {
      last if ( $char eq "\0" );
      $buffer .= $char;
   }
   return $buffer;
}
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/
<< |< 1 ... 3 4 5 6 7 >| >> 62 Einträge, 7 Seiten



View all threads created 2007-11-26 12:25.