【发布时间】:2016-05-15 16:22:13
【问题描述】:
我正在尝试找出一种使用 perl 解析数据流的正确方法。 我已经阅读了许多示例、文档和问题,但无法找到我基本上如何从数据流中剪切一个“包”并对其进行处理。 这是这种情况: - 从某个 IP 到 IP 和端口的数据流 - 流包含一些乱码,然后是一些内容,其中的数据以分号分隔
到目前为止,我的尝试是让 Socket 监听端口并处理 $data var:
#!/usr/bin/perl
use IO::Socket::INET;
# auto-flush on socket
$| = 1;
# creating a listening socket
my $socket = new IO::Socket::INET (
LocalHost => '127.0.0.1',
LocalPort => '7070',
Proto => 'tcp',
Listen => 5,
Reuse => 1
);
die "cannot create socket $!\n" unless $socket;
print "server waiting for client connection on port 7070 \n";
while(1)
{
# waiting for a new client connection
my $client_socket = $socket->accept();
# get information about a newly connected client
my $client_address = $client_socket->peerhost();
my $client_port = $client_socket->peerport();
print "connection from $client_address:$client_port\n";
# read up to 1024 characters from the connected client
my $data = "";
$client_socket->recv($data, 1024);
print "received data: $data\n";
@data_array = split(/;/,$data);
foreach (@data_array) {
print "$_\n";
}
# write response data to the connected client
$data = "ok";
$client_socket->send($data);
# notify client that response has been sent
shutdown($client_socket, 1);
}
$socket->close();
这可行,但据我了解,这会将整个流调整到最大大小,然后再进行处理。
我的问题: 如何确定我需要的部分(开始-结束),处理它然后继续下一个?
【问题讨论】:
-
传入数据的示例有助于理解问题——我们不知道是什么定义了您需要的部分。请注意,您通常可以假设流套接字完美地中继数据,因此为了避免在接收器上出现乱码,最好的对策是避免发送它。如果您不控制源,最好的办法是查找框架数据并从那里开始解析。
标签: perl sockets parsing stream