首页 > 解决方案 > Perl 从套接字写入文件

问题描述

perl 脚本的另一个问题。该脚本创建套接字,接受传入连接并将数据从套接字保存到文件。我使用netcat:

netcat 127.0.0.1 6000 <my_data.txt

但也许我会被迫用客户端编写一个 perl 脚本:/ 有可能吗?

这种方法是否正确完成?当我执行 scipt 时,我有:“不能使用字符串(“my_data.txt”)作为符号参考,而“严格参考”在“使用”错误指示 print $my_data "$data\n";

编辑:包含完整代码我的整个循环在这里:

#!/bin/perl
use strict;
use warnings FATAL => 'all';
use IO::Socket;
use JSON;

my $local_host;
my $local_port;
my $save_dir;
my $my_data;
#HELP
#sudo cpanm install JSON


sub config {
my $filename = 'perl_config.txt';
my $json_text = do {
    open(my $json_fh, "<:encoding(UTF-8)", $filename)
        or die("Nie moge otworzyc pliku!");
    local $/;
    <$json_fh>
};
my $json = JSON->new;

my $data = $json->decode($json_text);



$local_host=$data->{'local_host'};
$local_port=$data->{'local_port'};
$save_dir=$data->{'save_dir'};
$my_data=$data->{'my_data'};

#Tworzymy folder, jesli on nie istnieje!
if (! (-d $save_dir)) {
mkdir($save_dir,0755) ;
print "Folder do zapisu zostal stworzony pod nazwa: $save_dir\n" ;
  }


};


config();

my $my_socket = new IO::Socket::INET(
LocalHost => $local_host,
LocalPort => $local_port,
Proto     => 'tcp',
Listen    => 5,
Reuse     => 1
);
die "Nie udalo sie stworzyc socketu: my_socket $!n " unless $my_socket;
print "Mozesz juz wysylac dane z klienta \n";
my $accepter = $my_socket->accept();
open(DATA, ">$my_data");
while(<$accepter>){
#print $_;
#next;

my $data = <$my_socket>;
print $my_data "$data\n";

}



close(DATA);
close($my_socket);

标签: perlsockets

解决方案


目前尚不清楚为什么 OP 将配置存储在 JSON 文件中。

请调查以下使用 Config::General 模块读取配置文件的代码示例。

将您的网络浏览器指向http://localhost:8080并读取文件中的一些 html 标头数据socket_data.txt

use strict;
use warnings;
use feature 'say';

use IO::Socket;
use Config::General;

my $fname = 'socket_data.txt';
my $cfile = 'network.cnf';
my $count = 0;

my $conf   = Config::General->new($cfile);
my %config = $conf->getall;

$| = 1;

my $socket = new IO::Socket::INET(
    LocalHost => $config{host},
    LocalPort => $config{port},
    Proto     => $config{proto},
    Listen    => 5,
    Reuse     => 1
);

die "ERROR: can not open socket $!" unless $socket;

say 'Waiting for incoming data';

my $socket_handle = $socket->accept();

open my $fh, '>', $fname
    or die "Couldn't open $fname";

while( <$socket_handle> ) {
    chomp;
    last if $count++ == 10;
    say;
    say $fh $_;
}

close $fh;
close $socket_handle;

配置文件network.cnf

host  = 127.0.0.1
port  = 8080
proto = tcp

输出样本

GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1

推荐阅读