Perlfrage: Senden und Empfangen von Strings

H3llGhost

Registered User
Hallo Leute,

ich habe folgenden Code in PHP:

PHP:
      $host = gethostbyname("localhost");
      $port = 27501;
      $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
      $packet = chr(255).chr(255)."Z".chr(255);
      $bytes_sent = socket_sendto($socket, $packet, strlen($packet), 0, $host, $port);
      echo "<b>".$bytes_sent."</b> bytes <b>OK</b></li>";

      echo "<li>Retrieving data from server...";
      $recv_bytes = 0;
      $buffer     = "";
      $timeout    = 30;
      $answer     = "";
      $packets    = 0;
      $read       = array($socket);
      while (socket_select($read, $write = NULL, $except = NULL, &$timeout) > 0) {
        $recv_bytes += socket_recvfrom($socket, &$buffer, 2000, 0, &$host, &$port);
        if (($buffer[0] == chr(255)) && ($buffer[1] == chr(255)) && ($buffer[2] == "Z") && ($buffer[3] == chr(255)) && 
            ($buffer[4] == "1") && ($buffer[5] == ".") && ($buffer[6] == "0") && ($buffer[7] == "0") && ($buffer[8] == chr(255))) { 
          $answer     .= substr($buffer, 9, strlen($buffer));
        }  
        $buffer     = "";
        $timeout    = "1";
        $packets++;
      }

Im ersten Teil des Codes sendet er ja weiß und im zweiten Teil empfängt der ja was.
Den ersten Teil bekomme ich auch realisiert in Perl, aber an den Zweiten scheiter ich.

So sieht mein Perl-Code bis jetzt aus:

Code:
#!/usr/bin/perl

use strict;
use warnings;

use IO::Socket;
use IO::Select;

my $g_masterserver_address = "127.0.0.1";
my $g_masterserver_port    = "27501";
	
	my $timeout = 0;

	my $address        = $g_masterserver_address;
	my $port           = $g_masterserver_port;
	my $dest           = sockaddr_in($port, inet_aton($address));
	my ($rin, $rout, $test);

	my $msg = chr(0xff).chr(0xff)."Z".chr(0xff);
	my $s_socket;
	my $proto = getprotobyname('udp');
	socket($s_socket, AF_INET, SOCK_DGRAM, $proto);
	my $bytes = send($s_socket, $msg, 0, $dest);
	print("sent $bytes bytes to '$address:$port'");
	my $buffer = '';
	my $s_output;
	if (IO::Select->new($s_socket)->can_read(2))
	{
		$s_socket->recv($s_output, 1024);
		print $s_output;
		# print "yes";
		# while (my $rc = $s_socket->recv($s_output, 1024) ) {
			# print $s_output;
			# $buffer .= $s_output;
		# }
	}

exit(0);

Hat jemand eine Idee, was ich verändern muss, damit es klappen kann?

Danke im Voraus!
 
Dein Code ist recht unverständlich, da Du hier OOP-Code mit funktionalem-Code mischst.
Initialisiere den Socket bereits über IO::Socket::INET->new(). Denn die Funktion "socket()" gibt es bereits. Perl kann sich evtl. nicht entscheiden, welche Socket-Funktion er nutzten soll, bzw. nimmt im Zweifelsfall die falsche.

huschi.
 
Back
Top