到目前为止,我已经编写了一个在后台不断运行的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直到另一个客户端连接到服务器的原因.