免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2069 | 回复: 4
打印 上一主题 下一主题

请教一个SOCKET的问题。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-10 16:30 |只看该作者 |倒序浏览
您好:
我现在有个SOCKET模拟脚本:
1:#!/usr/bin/perl -w
use Socket;
use IO::Handle;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname("tcp"));
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1);
my $addr=sockaddr_in(3000,INADDR_ANY);
bind(SOCK,$addr);

listen(SOCK,SOMAXCONN);
     
while(1){
next unless my $addr1=accept(S,SOCK);

S->autoflush(1);
STDOUT->autoflush(1);

# start up simple_invork.pl
#system("perl test1.pl \n");
print S "welcome\n";       
while(<S>){
  print $_;
  chomp;
  print S scalar(`$_`)."\n";   

  
}
}

2.#!/usr/bin/perl -w
use Socket;
use IO::Handle;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname("tcp"));

my $addr=sockaddr_in(3000,inet_aton("192.168.0.100"));
connect(SOCK,$addr);
SOCK->autoflush(1);
$buff=<SOCK>;
STDOUT->autoflush(1);
print $buff;
while(1){
$in=<STDIN>;   
send(SOCK,$in,0);
while(my $l=sysread(SOCK,$buff,9999999)){
print $buff;
last;
}

}

3.
sub main
{

while(my $loc_Line = <STDIN>)
{
    chomp $loc_Line;
    my $str = test($loc_Line);
    syswrite(STDOUT, "[BEGIN]\n");
    syswrite(STDOUT, "is ok --$str\n");
    syswrite(STDOUT, "[END]\n");
}
}


sub test
{
        my $str  = shift;
        $str = $str.' this is test ! \n';
        return $str;
}
main();

请问如何修改脚本实现以下功能:
执行脚本1,2,在脚本2的机器上输入一个'test',通过SOCKET传到脚本1里,
在脚本1中执行脚本3并传入'test'值日,并将脚本3返回的值传给脚本2。

请问改怎么改呢??小弟对网络编程根本不懂。。。 实在不知道改怎么处理了?麻烦大家帮帮忙了

论坛徽章:
0
2 [报告]
发表于 2009-12-10 17:32 |只看该作者
哪位大侠帮忙解决解决吧。。。 实在搞不定啊。。

论坛徽章:
0
3 [报告]
发表于 2009-12-10 17:40 |只看该作者
script2 -> script1 -> script3
script2 <-    ...      <- script3
应该是 script 3 通过 script 1 发给 script2 吧?
而 2, 1 之间已经有 socket 连接了,按你的需求,1,3之间通过 pipe 通信即可,但要保证通信持续同步的话,1 fork一个子程序,父负责 send 方向,子负责 recv 方向

其实你的脚本,用 POE 会简单很多……

而如果 socket 不懂的话,先看 network programming with perl 再看 POE 吧,基本的东西还是很重要的~

论坛徽章:
0
4 [报告]
发表于 2009-12-10 19:06 |只看该作者
友情帮顶

论坛徽章:
0
5 [报告]
发表于 2009-12-10 19:28 |只看该作者
呵呵,谢谢大家了。。。
因为对PERL  通信这一块一点都不熟悉
所以我调整了下代码实现了,不过性能方面会损失。。。只能达到基本实现
1.#!/usr/bin/perl -w
use Socket;
use IO::Handle;
use IPC::Open3;
use test1;
socket(SOCK,AF_INET,SOCK_STREAM,getprotobyname("tcp"));
setsockopt(SOCK,SOL_SOCKET,SO_REUSEADDR,1);
my $addr=sockaddr_in(3000,INADDR_ANY);
bind(SOCK,$addr);

listen(SOCK,SOMAXCONN);
     
while(1){
next unless my $addr1=accept(S,SOCK);

S->autoflush(1);
STDOUT->autoflush(1);
print S "welcome\n";
while(<S>){
  my $res = test1::main($_);
       

  chomp $res;
  print S "$res\n";   

  
}
}

3.package test1;

sub main
{

my $loc_Line = shift;

    chomp $loc_Line;
    my $str = test($loc_Line);
        print "$str";
    my $ret = "[BEGIN]is ok --".$str."\n[END]\n";

  return $ret;

}


sub test
{
        my $str  = shift;
        $str = $str.' this is test ! \n';
        return $str;
}

1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP