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

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);  #发送连接状态回复信息
客户端能接收到服务端的数据吗?
客户端能收到服务端的数据。
要不直接把所有代码贴出来
帮你调试下
socket 的话..
如果不是用sysread或syswrite 去接收/传送string..
最好
1.先打开$SOCKET的autoflush...这个是必要的..因为机器会buffer....
2.送出的String最後面一定要有\n, 不要用\r\n...

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

建立好连接之后就已经 $CliSocket->autoflush(1);
不过倒是没有加上\n。试下先。
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~


QUOTE:
原帖由 Rush_2008 于 2008-7-2 11:05 发表
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~

http://www.wireshark.org/
抓包分析吧。
别瞎猜了。


QUOTE:
原帖由 Rush_2008 于 2008-7-2 11:05 发表
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~

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

如果Server端用类似 <SOCKET> 或Java的getLine() 的话..要特别注意
\r\n, 之前发现自己写的程序...只要碰到\r\n, 都会读不到....
可能你要看一下Server端的Log与Server的写法...
感觉apile 和flw的热心帮忙,我现在只有准备抓下包看下。