在php和perl之间发送和接收数据时出现问题?
我在php和perl套接字之间发送和接收数据时遇到问题: -问题:在php和perl之间发送和接收数据时出现问题?,php,perl,Php,Perl,我在php和perl套接字之间发送和接收数据时遇到问题: -问题: php无法将所有字节数据发送到perl套接字 Perl套接字无法从php接收所有数据 下面是php代码: function save(){ unset($_SESSION['info']); unset($_SESSION['data']); global $config,$ip; $start=$_POST['config']; $fp = fsockopen($_SESS
- php无法将所有字节数据发送到perl套接字
- Perl套接字无法从php接收所有数据
function save(){
unset($_SESSION['info']);
unset($_SESSION['data']);
global $config,$ip;
$start=$_POST['config'];
$fp = fsockopen($_SESSION['ip'], $config['port'], $errno, $errstr, 30);
if(!$fp) {
$_SESSION['info']="Not connect ";
transfer("Not connect".$ip, "index.php?com=server&act=info");
} else {
$_SESSION['info']="Save config - ".$ip;
fwrite($fp,$start);
transfer("Sending data to ".$ip, "index.php?com=server&act=info");
}
}
下面是perl套接字代码:
#!/usr/bin/perl
use strict;
use warnings;
use Carp;
use POSIX qw( setsid );
use IO::Socket;
$| = 1;
my $socket = new IO::Socket::INET (
LocalHost => '192.168.150.3',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
);
die "Coudn't open socket" unless $socket;
print "\nTCPServer Waiting for client on port 5000";
my $client_socket = "";
while ($client_socket = $socket->accept()) {
my $recieved_data =" ";
my $send_data=" ";
my $peer_address = $client_socket->peerhost();
my $peer_port = $client_socket->peerport();
print "\n I got a connection from ( $peer_address , $peer_port ) ";
print "\n SEND( TYPE q or Q to Quit):";
$client_socket->recv($recieved_data,20000);
#while (defined($recieved_data = <$client_socket>)) {
if ( $recieved_data eq 'q' or $recieved_data eq 'Q' ) {
close $client_socket;
last;
}
elsif ($recieved_data eq 'start' or $recieved_data eq 'START' ) {
$send_data = `/etc/init.d/squid start`;
}
elsif ($recieved_data eq 'restart' or $recieved_data eq 'RESTART' ) {
$send_data = `/etc/init.d/squid restart`;
}
elsif ($recieved_data eq 'stop' or $recieved_data eq 'STOP' ) {
$send_data = `/etc/init.d/squid stop`;
}
elsif ($recieved_data eq 'hostname' or $recieved_data eq 'HOSTNAME' ) {
$send_data= `hostname`;
}
elsif ($recieved_data eq 'view-config' or $recieved_data eq 'VIEW-CONFIG' ) {
$send_data = `cat /etc/squid/squid.conf` ;
}
else {
#print $recieved_data;
open OUTPUT_FILE, '> /root/data' or die("can not open file");
print OUTPUT_FILE $recieved_data;
close OUTPUT_FILE
}
#}
if ($send_data eq 'q' or $send_data eq 'Q') {
$client_socket->send ($send_data);
close $client_socket;
last;
}
else {
$client_socket->send($send_data);
}
}
#/usr/bin/perl
严格使用;
使用警告;
使用鲤鱼;
使用POSIX qw(设置ID);
使用IO::Socket;
$| = 1;
my$socket=新IO::socket::INET(
LocalHost=>'192.168.150.3',
LocalPort=>“5000”,
Proto=>“tcp”,
听着=>5,
重用=>1
);
除非$socket,否则模具“无法打开插座”;
打印“\nTCPServer正在端口5000上等待客户端”;
我的$client_socket=“”;
而($client_socket=$socket->accept()){
我的$received_data=“”;
我的$send_data=“”;
my$peer_address=$client_socket->peerhost();
my$peer_port=$client_socket->peerport();
打印“\n我从($peer\u地址,$peer\u端口)获得连接”;
打印“\n发送(键入q或q退出):”;
$client_socket->recv($received_data,20000);
#而(已定义($received_data=){
如果($received_data eq'q'或$received_data eq'q'){
关闭$client_套接字;
最后;
}
elsif($received_data eq'start'或$received_data eq'start'){
$send_data=`/etc/init.d/squid start`;
}
elsif($Received_data eq'restart'或$Received_data eq'restart'){
$send_data=`/etc/init.d/squid restart`;
}
elsif($received_data eq'stop'或$received_data eq'stop'){
$send_data=`/etc/init.d/squid-stop`;
}
elsif($received_data eq'hostname'或$received_data eq'hostname')){
$send_data=`hostname`;
}
elsif($received_data eq'view-config'或$received_data eq'view-config'){
$send_data=`cat/etc/squid/squid.conf`;
}
否则{
#打印$received_数据;
打开输出文件“>/root/data”或die(“无法打开文件”);
打印输出文件$received\u数据;
关闭输出文件
}
#}
如果($send_data eq'q'或$send_data eq'q'){
$client\u socket->send($send\u data);
关闭$client_套接字;
最后;
}
否则{
$client\u socket->send($send\u data);
}
}
您忘记实际编写解析接收数据的代码。TCP是一种字节流协议,不保留应用程序消息边界。除非这恰好是您所需要的(这里显然没有),否则您需要在TCP之上开发和实现一个协议,以提供应用程序所需的功能。首先,您需要某种方法来找到命令的结尾。你的代码绝对不能让接收者这么做
无论协议有多简单,您都应该花时间编写协议规范。协议规范应明确规定字节级别的消息格式。协议规范应明确指定客户端在拥有完整消息时如何识别
然后,您实际上必须编写代码来实现该协议
在这种情况下,您可以简单地编写一个零字节来标记消息的结束。然后对接收器进行编码,以保持接收数据,直到它接收到一个零字节。然后,它就知道了消息之前的一切。您忘记了实际编写解析接收数据的代码。TCP是一种字节流协议,不保留应用程序消息边界。除非这恰好是您所需要的(这里显然没有),否则您需要在TCP之上开发和实现一个协议,以提供应用程序所需的功能。首先,您需要某种方法来找到命令的结尾。你的代码绝对不能让接收者这么做 无论协议有多简单,您都应该花时间编写协议规范。协议规范应明确规定字节级别的消息格式。协议规范应明确指定客户端在拥有完整消息时如何识别 然后,您实际上必须编写代码来实现该协议
在这种情况下,您可以简单地编写一个零字节来标记消息的结束。然后对接收器进行编码,以保持接收数据,直到它接收到一个零字节。然后它就知道了所有信息。你能解释一下你是如何知道它不起作用的吗?你看到它在做什么?到目前为止,你做了什么来追踪这个问题?你能解释一下你是如何知道它不起作用的吗?你看到它在做什么?到目前为止,你做了什么来追踪这个问题?