PHP To Perl套接字通信

到目前为止,我已经编写了一个在后台不断运行的Perl服务器,当它收到入站连接时,一个进程被分叉,然后处理那个连接.我最终希望能够做的是接受通过套接字的入站php连接,当然运行这些命令然后中继和信息.到目前为止,我已经设法使用Perl脚本客户端100%工作,但它不能100%使用php.

[而不是在这里粘贴文本的孔墙是实际的发送和接收部分.]

print "Binding to port ...\n";
$server = IO::Socket::INET->new(
            Listen => 1, 
            LocalAddr => $_server, 
            LocalPort => $_port, 
            Proto => 'tcp', 
            Reuse => 1, Type => SOCK_STREAM) || die "Cant bind :$@\n";
$proccess = fork();
if ($proccess) {
    kill(0);
}
else {
    while(1) {
        while ($client = $server->accept()) {
            $client->autoflush(1);
            $con_handle = fork();
            if ($con_handle) {
                print "Child Spawned [$con_handle]\n";
            }else{
                while (defined($line = <$client>)) {
                    $command = `$line`;
                    print $client $command;
                }
                exit(0);
            }
        }
    }

正如我所说,这可以在本地和远程使用perl编写的客户端工作正常但不能100%使用php,我的意思是100%是服务器将重新接收命令但无法将其发回,或者服务器能够重新接收命令,但客户端无法读取回复.

这是我工作最多的客户端[php].

$handle = fsockopen("tcp://xx.xx.xx.xx",1234);
fwrite($handle,"ls");
echo fread($handle);
fclose($handle);

这是工作的perl客户端

#!/usr/bin/perl -w
use strict;
use IO::Socket;
my ($host, $port, $kidpid, $handle, $line);

unless (@ARGV == 2) { die "usage: $0 host port" }
($host, $port) = @ARGV;

# create a tcp connection to the specified host and port
$handle = IO::Socket::INET->new(Proto     => "tcp",
                                PeerAddr  => $host,
                                PeerPort  => $port)
       or die "can't connect to port $port on $host: $!";

$handle->autoflush(1);              # so output gets there right away
print STDERR "[Connected to $host:$port]\n";

# split the program into two processes, identical twins
die "can't fork: $!" unless defined($kidpid = fork());

# the if{} block runs only in the parent process
if ($kidpid) {
    # copy the socket to standard output
    while (defined ($line = <$handle>)) {
        print STDOUT $line;
    }
    kill("TERM", $kidpid);                  # send SIGTERM to child
}
# the else{} block runs only in the child process
else {
    # copy standard input to the socket
    while (defined ($line = <STDIN>)) {
        print $handle $line;
    }
}

如果有帮助我可以在需要时发布整个服务器.

最佳答案 您的服务器希望客户端发送线路.但是你的PHP客户端只发送两个字符“ls”.这意味着您的服务器将等待客户端发送换行符.

编辑:

>您的Perl(服务器)代码使用面向行的协议.您的PHP代码不是.你不应该混合两种沟通方式.
>您的Perl客户端确实使用面向行的协议.
>您的PHP代码应该使用fgets()而不是fread().
>在您的服务器中,父进程使套接字保持打开客户端.这就是当孩子退出时套接字没有关闭的原因,这可能是你的客户端看不到EOF直到另一个客户端连接到服务器的原因.

点赞