免费注册 查看新帖 |

Chinaunix

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

tcp连接发送消息问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-01 11:24 |只看该作者 |倒序浏览
server code:

  1. #!/usr/bin/perl -w
  2. #testservers

  3. use strict;
  4. my $face=qq~
  5. ##########################################
  6. #
  7. #Perl_CMD
  8. ##########################################
  9. ~;
  10. print $face;
  11. undef $face;

  12. my $port=23456;
  13. my $PF_INET=2;
  14. my $SOCK_STREAM=1;
  15. my $proto=getprotobyname("tcp");
  16. my $ADDR=pack('SnC4x8',$PF_INET,$port,127,0,0,1);
  17. my $command;
  18. $|=1;  #关闭perl内部缓冲区
  19. socket(SERVERS,$PF_INET,$SOCK_STREAM,$proto) || die "can't build a socket\n";
  20. bind(SERVERS,$ADDR) || die "can't bind a SOCK\n";
  21. listen(SERVERS,2);
  22. for(;my $paddr=accept(CLIENT,SERVERS);)
  23. {
  24.         recv(CLIENT,$command,240,0);
  25.         print $command;
  26.         #if($command and $command=~/^\/\//)
  27.         if($command)
  28.         {
  29.                 my @turndate=&dir($command);
  30.                 foreach my $onedate (@turndate) {
  31.                         send (CLIENT,$onedate,0);
  32.                 }
  33.         }else{
  34.                 print CLIENT "Error CMD format\n";
  35.         }
  36. }

  37. close CLIENT;
  38. sub dir
  39. {
  40.         my $cmd=shift;
  41.         #$cmd=~s/^\/\/(.*)//;
  42.         my @turncmd=`$cmd`;
  43.         return @turncmd;
  44. }
复制代码


client code:

  1. #!/usr/bin/perl -w
  2. #testclient

  3. use strict;
  4. my $port=23456;
  5. my $PF_INET=2;
  6. my $SOCK_STREAM=1;
  7. my $proto=getprotobyname("tcp");
  8. $|=1;

  9. my $ADDR=pack('SnC4x8',$PF_INET,$port,127,0,0,1);
  10. socket(CLIENT,$PF_INET,$SOCK_STREAM,$proto) or die "can't create socket\n";
  11. connect(CLIENT,$ADDR) or die "can't link\n";
  12. print "[HuaiHuai]";
  13. while(1)
  14. {
  15. my $cmd=<stdin>;

  16. send(CLIENT,"$cmd",0);
  17. while(<CLIENT>)
  18. {
  19.         print $_;
  20. };
  21. print "[HuaiHuai]";
  22. }

复制代码


网上一段代socket代码,我将其修改了一下,使其能循环读取客户端的命令,然后把结果发送过来.
不知为啥卡在
while(<CLIENT>
{
        print $_;
};
这一段代码上了...跳不出来了.请各位帮我解答一下.

论坛徽章:
0
2 [报告]
发表于 2006-03-01 19:17 |只看该作者
偶没仔细看你的program,但听你这句话:
网上一段代socket代码,我将其修改了一下,使其能循环读取客户端的命令,然后把结果发送过来.

以及你的client的单进程实现方式,就知道肯定不行了。

在一个进程里循环发送数据和读取数据,不block才怪了。
你这里需要进一步改下client,在父进程发送数据,然后fork出child,在child里接受数据。这样方可避免阻塞。

论坛徽章:
0
3 [报告]
发表于 2006-03-01 21:56 |只看该作者
不知道和c中的socket有啥不同,反正在c中是不必再createthread的,
for(;my $paddr=accept(CLIENT,SERVERS)
忙乎了好久,终于发现问题出在这,总在这accept连接,前一个连接就卡了,又来一个新连接.
结果就....

论坛徽章:
0
4 [报告]
发表于 2006-03-01 22:33 |只看该作者
server code

for(;my $paddr=accept(CLIENT,SERVERS)
{
        recv(CLIENT,$command,240,0);
        print $command;
        #if($command and $command=~/^\/\//)
        if($command)
        {
                my @turndate=&dir($command);
                foreach my $onedate (@turndate) {
                        send (CLIENT,$onedate,0);
                }
        }else{
                print CLIENT "Error CMD format\n";
        }
        close CLIENT;
}

client code

while(1)
{
socket(CLIENT,$PF_INET,$SOCK_STREAM,$proto) or die "can't create socket\n";
connect(CLIENT,$ADDR) or die "can't link\n";
print "[HuaiHuai]";

my $cmd=<stdin>;

send(CLIENT,"$cmd",0);
while(<CLIENT>
{
        print $_;
};
}

你这里是因为server端没关闭client的连接,client一直以为还有数据所以阻塞了。
在c里也要自己在server上fork来接受新连接的,多进程。

论坛徽章:
0
5 [报告]
发表于 2006-03-02 09:25 |只看该作者
是个好主意,但这样断断连连,是不是不太好,怎么不连一次,把该做的事做完???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP