php - 将数据从Web服务器发送到Perl套接字监听器

标签 php perl sockets

我尝试将数据从php Web脚本发送到本地perl套接字监听器。
这是perl服务器代码:

#!/usr/bin/perl

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

$| = 1;

my $web = new IO::Socket::INET (
    LocalHost => '127.0.0.1',
    LocalPort => '9001',
    Proto => 'tcp',
    Listen => 5,
    Reuse => 1
) or die "ERROR in Socket Creation : $!\n";

while ($web->accept()) {
    my $web_address = $web->peerhost();
    my $web_port = $web->peerport();

    print "Accepted New Web Client Connection From : $web_address, $web_port\n";

    my $data = <$web>;
    chomp ($data);
    print "Data from web: $data\n";
}

这是PHP代码:
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Couldn't create socket: [$errorcode] $errormsg \n");
}

echo "Socket created \n";

if(!socket_connect($sock , '127.0.0.1' , 9001))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not connect: [$errorcode] $errormsg \n");
}

echo "Connection established \n";

$message = "GET / HTTP/1.1\r\n\r\n";

if( !socket_send ($sock , $message , strlen($message) , 0))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not send data: [$errorcode] $errormsg \n");
}

echo "Message send successfully \n";

这是perl脚本的输出:
Accepted New Web Client Connection From : , 
Data from web:

这是PHP脚本的输出:
Socket created 
Connection established 
Message send successfully

那么,为什么它实际上不发送数据呢?

最佳答案

$web->accept()仅创建并返回一个对象,该对象可用于读取句柄(用于套接字)。您正在尝试使用$web本身读取,但是它无法读取。换句话说,<$web>不会从套接字读取。 PHP客户端已发送其消息,该消息位于缓冲区中等待读取。

此外,在PHP客户端打印时,它正在填充缓冲区,因为在另一端没有东西将其清空(读取)。如果在某一时刻打印足够,则缓冲区将满,而下一个打印将挂起,仅等待。当不按顺序读取缓冲区时,这是常见的错误来源。

您的代码需要进行一些小的更改

if ( my $listen = $web->accept() ) {
    my ($buff, $recd);
    while (defined($buff = <$listen> ) { 
        chomp($recd = $buff);
        # process the line in $recd
    }
} else { warn "Error with the socket  -- $!"; }

发送时,需要围绕while$buff = <$listen>读取多行内容。对于允许的多个连接,所有这些都应该在一个while循环中。简而言之,对于您发布的示例中的单行消息
my $listen = $web->accept();
my $recd = <$listen>;
chomp($recd);
print "$recd\n";

这是Perl代码所能达到的。我不知道PHP例程是如何工作的(对我来说它们似乎还可以)。

尽管IO::Socket提供了基本信息,但Perl文档中还有很多其他内容。例如,有一个使用IO::Socket的服务器示例
Perl IPC,到该页面的最后。

如果我建议,请在开头添加use warnings;。实际上,它非常有用。我怀疑这会警告您。

关于php - 将数据从Web服务器发送到Perl套接字监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35617147/

相关文章:

php - 如何使用 CURL 从页面解析实际的 HTML?

linux - 一种转换音频文件比特率/格式的方法(在上传和存储到 S3 之间)

c++ - 是否可以配置 UDP 多播套接字以便可以调用 write() 而不是 sendto()?

c - 主机之间的持久 TCP 连接,即使 IP 地址发生变化

php strtotime 不起作用

javascript - Wordpress - wp_enqueue_script/wp_enqueue_style 不起作用

ruby - 如何删除 XML::Simple 输出中的 <opt> 标记?

perl - 如何防止子程序在 Perl 中被覆盖?

Perl 一行提取多行模式

node.js - 当客户端发出时如何测试 socket.io 服务器