perl socket编程 服务端无法接收到客户端所发消息

Rush_2008
perl socket编程 服务端无法接收到客户端所发消息

问题已经困扰我有一段时间了,在公司进行测试的时候程序能正常运行,但是一放到服务器上(linux),程序运行后,服务端就报收不到消息。我写的是客户端。但是用java的测试程序服务端又能收到。

  下面我贴下发送消息的那块代码,大家看看是什么问题


   # 发送消息方法
  sub sendConnStr{
  my ($CliSocket,$strConnectString,$strPassword) = @_;
  my $lencon = length($strConnectString);
  my $lenpaw = length($strPassword);
  while($lencon>0){
     my $relen = syswrite($CliSocket,$strConnectString,$lencon);
    #$CliSocket->flush();
     $lencon = $lencon-$relen;
     unless($relen){
      $logState->setState(State->STATE_STOP,"发送连接字符失败,程序退出");
      print STDERR getLongTime()." 发送连接字符失败,程序退出!/n";
      exit;
     }
  }
  while($lenpaw>0){
     my $relen = syswrite($CliSocket, $strPassword ,$lenpaw);
    # $CliSocket->flush();
     $lenpaw = $lenpaw-$relen;
     unless($relen){
      $logState->setState(State->STATE_STOP,"发送连接密码失败,程序退出");
      print STDERR getLongTime()." 发送连接密码失败,程序退出!/n";
      exit;
     }
  }

  #建立socket连接

      if ( $ReconEveryDay) {
            $socketcnt=0;
            vec($rin, fileno($CliSocket), 1) = 0;
            do {
              sleep(3);
              $CliSocket->close() if $CliSocket;
              $CliSocket = IO::Socket::INET->new('PeerAddr' => $var{IpAddress},
                                                 'PeerPort' => $var{IpPort},
                                                 'Proto'    => $Proto);
              unless($CliSocket){
                 if($socketcnt>10){
                    $logState->setState(State->STATE_STOP,"每日重连socket时连接次数超过10次,程序退出");
                    print STDERR getLongTime()." 每日重连socket时连接次数超过10次,程序退出,让监控程序重起该程序!/r/n";  
                    exit;
                 }
                 $logState->setState(State->STATE_ERROR,"每日重新连接socket ".$var{ServerName}." 失败");
                 print STDERR getLongTime()." 每日重新连接socket ".$var{ServerName}." 失败!/r/n";
                 $socketcnt ++;
               }                                   
            } until ($CliSocket);
            $socketcnt=0;  
            #$CliSocket->autoflush(1);
            $logState->setState(State->STATE_TRACE,"每日重新连接socket ".$var{ServerName}." 成功");
            print getLongTime()." 每日重新连接socket ".$var{ServerName}." 成功!/r/n";
   #调用发送消息方法

sendConnStr($CliSocket,$sendAlarmAck);  #发送连接状态回复信息

小公猫
客户端能接收到服务端的数据吗?

Rush_2008
回复 #2 小公猫 的帖子

客户端能收到服务端的数据。

churchmice
要不直接把所有代码贴出来
帮你调试下

apile
socket 的话..
如果不是用sysread或syswrite 去接收/传送string..
最好
1.先打开$SOCKET的autoflush...这个是必要的..因为机器会buffer....
2.送出的String最後面一定要有/n, 不要用/r/n...

楼主的问题..可能是没有打开autoflush或没加上/n吧....

[[i] 本帖最后由 apile 于 2008-6-30 10:32 编辑 [/i]]

Rush_2008
回复 #5 apile 的帖子

建立好连接之后就已经 $CliSocket->autoflush(1);:)
不过倒是没有加上/n。试下先。

Rush_2008
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~:shock:

flw
[quote]原帖由 [i]Rush_2008[/i] 于 2008-7-2 11:05 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8716847&ptid=1182244][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~:shock: [/quote]
[url]http://www.wireshark.org/[/url]
抓包分析吧。
别瞎猜了。

apile
[quote]原帖由 [i]Rush_2008[/i] 于 2008-7-2 11:05 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8716847&ptid=1182244][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~:shock: [/quote]

看不到Server 端代码....不清楚发生什麽事情....

如果Server端用类似 <SOCKET> 或Java的getLine() 的话..要特别注意
/r/n, 之前发现自己写的程序...只要碰到/r/n, 都会读不到....
可能你要看一下Server端的Log与Server的写法...

Rush_2008
回复 #9 apile 的帖子

感觉apile 和flw的热心帮忙,我现在只有准备抓下包看下。

Rush_2008
非常感谢,问题已经解决了。果然是要抓了包才知道正在发送的是什么东东。:wink: