1

アプリが実行されているのと同じPCでTCPサーバーをエミュレートしようとしています。私はあまり経験がないので、Perlでそれができるかどうかわかりません。

以下のコードでは、最初の応答は機能していますが、2番目の応答を実装する方法がわかりません。

#!/usr/bin/perl -w

use IO::Socket::INET;
use strict;


my $socket = IO::Socket::INET->new('LocalPort' => '3000',
                   'Proto' => 'tcp',
                   'Listen' => SOMAXCONN)
    or die "Can't create socket ($!)\n";
print "Server listening\n";
while (my $client = $socket->accept) {
    my $name = gethostbyaddr($client->peeraddr, AF_INET);
    my $port = $client->peerport;
    while (<$client>) {
    print "$_";
    print $client "RESPONSE1";
    }
    close $client
    or die "Can't close ($!)\n";
}
die "Can't accept socket ($!)\n";

編集:入力してくれてありがとう、私はphpがそれを実行し、その動作をすることになりました、イェーイ!

4

3 に答える 3

2

接続にはNet::Serverを使用し、現在の状態(このコードでは$ state)を維持するためにsubの変数を使用します。このようなもの:

package MyServer;
use base qw/Net::Server/;
use strict;
use warnings;

sub process_request {
  my $self = shift;
  my $state = 0;
  while (<STDIN>) {
    s/\r?\n$//; # like chomp but for crlf too
    if ($state == 0 and $_ eq 'data1') {
      print "> okay1\n";
      $state++;
    } elsif ($state == 1 and $_ eq 'data2') {
      print "> okay2\n";
      $state++;
    } else {
      last if $state == 2;
      $state = 0;
    }
  }
}

my $port = shift || 3000;
MyServer->run( port => $port );

Net :: Server PODの例では、アラームを使用して接続をタイムアウトすることを提案しています。これは、ここでは適切な場合があります。上記のコードは次のことを行います。

$ nc localhost 3000
data1
> okay1
data2
> okay2
data3
$

また、フォーク/プリフォーク/非ブロッキング/コルーチン駆動型システムに移行する必要がある場合は、そのためのNet::Serverパーソナリティがあります。

于 2012-11-01T06:56:14.670 に答える
0

「準備完了」コード:

package MyServer;
use base qw/Net::Server/;
use strict;
use warnings;

sub process_request {
  my $self = shift;
  my $state = 0;
  $| = 1;
  binmode *STDIN;
  while (read(*STDIN, local $_, 3 )) {
    if ($state == 0 and $_ eq "\x{de}\x{c0}\x{ad}") {
      print "\x{c4}\x{1a}\x{20}\x{de}";
      $state++;
    } elsif ($state == 1 and $_ eq "\x{18}\x{c0}\x{0a}") {
      print "\x{11}\x{01}\x{73}\x{93}";
      $state++;
      last;
    }
  }
}

my $port = shift || 3000;
MyServer->run( port => $port );
于 2012-11-03T04:18:17.190 に答える
0

ローポート(私の状況では、ポート23 )が設定されていると、process_requestsubが正しく機能しないようです。特にローポートの場合のみ、データ入力を解析している間、最初のリクエストには追加の文字が含まれます(ただし、後続のリクエストではすべて問題ありません)。ヒントはありますか?ありがとうございました

于 2013-05-14T09:39:50.610 に答える