Chinaunix
标题:
perl socket编程 服务端无法接收到客户端所发消息
[打印本页]
作者:
Rush_2008
时间:
2008-06-27 17:09
标题:
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); #发送连接状态回复信息
作者:
小公猫
时间:
2008-06-29 14:49
客户端能接收到服务端的数据吗?
作者:
Rush_2008
时间:
2008-06-30 09:16
标题:
回复 #2 小公猫 的帖子
客户端能收到服务端的数据。
作者:
churchmice
时间:
2008-06-30 09:46
要不直接把所有代码贴出来
帮你调试下
作者:
apile
时间:
2008-06-30 10:30
socket 的话..
如果不是用sysread或syswrite 去接收/传送string..
最好
1.先打开$SOCKET的autoflush...这个是必要的..因为机器会buffer....
2.送出的String最後面一定要有\n, 不要用\r\n...
楼主的问题..可能是没有打开autoflush或没加上\n吧....
[
本帖最后由 apile 于 2008-6-30 10:32 编辑
]
作者:
Rush_2008
时间:
2008-07-02 10:41
标题:
回复 #5 apile 的帖子
建立好连接之后就已经 $CliSocket->autoflush(1);
不过倒是没有加上\n。试下先。
作者:
Rush_2008
时间:
2008-07-02 11:05
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~
作者:
flw
时间:
2008-07-02 11:48
原帖由
Rush_2008
于 2008-7-2 11:05 发表
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~
http://www.wireshark.org/
抓包分析吧。
别瞎猜了。
作者:
apile
时间:
2008-07-02 13:43
原帖由
Rush_2008
于 2008-7-2 11:05 发表
apile 兄,还是不行啊。奇怪的是我的java客户端发的消息,服务端就可以收到,perl却不行。很是郁闷~
看不到Server 端代码....不清楚发生什麽事情....
如果Server端用类似 <SOCKET> 或Java的getLine() 的话..要特别注意
\r\n, 之前发现自己写的程序...只要碰到\r\n, 都会读不到....
可能你要看一下Server端的Log与Server的写法...
作者:
Rush_2008
时间:
2008-07-02 15:20
标题:
回复 #9 apile 的帖子
感觉apile 和flw的热心帮忙,我现在只有准备抓下包看下。
作者:
Rush_2008
时间:
2008-07-02 18:20
非常感谢,问题已经解决了。果然是要抓了包才知道正在发送的是什么东东。:wink:
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2