是“perforce”吗;“对等端重置连接”;错误真的是错误吗?

是“perforce”吗;“对等端重置连接”;错误真的是错误吗?,perforce,Perforce,P4服务器版本:P4D/LINUX26X86_64/2013.2/938876(2014/09/23) 关于RHEL6 在使用p4perl运行perl脚本时,我捕获了一个类似这样的错误 if ($p4->ErrorCount() { foreach $err ($p4->Errors) { print "$err\n"; } } 这些错误以一种不确定的方式出现,有时我会得到,有时不会。但是如果我用上面的代码捕获一个错误,我得到 TCP receive

P4服务器版本:P4D/LINUX26X86_64/2013.2/938876(2014/09/23) 关于RHEL6

在使用p4perl运行perl脚本时,我捕获了一个类似这样的错误

if ($p4->ErrorCount() {
    foreach $err ($p4->Errors) {
        print "$err\n";
    }
}
这些错误以一种不确定的方式出现,有时我会得到,有时不会。但是如果我用上面的代码捕获一个错误,我得到

TCP receive failed.
read: socket:
Connection reset by peer
这是一个真正的错误吗(显然,连接被重置了?) 我可以忽略这个吗?重置连接后,它会运行我想要运行的东西吗?还是需要重新运行该命令

我担心问题的根源可能是perl脚本在前面做了一个fork,而我得到的$p4句柄被发送到了fork进程。我可以这样做来检测和补救吗

use P4;
our $p4 = new P4;

<perl forks off a new process...>

if(!($p4-IsConnected)) {
    $p4->SetCwd("$CWD");
        if($p4->ErrorCount()) {handle_p4_error();} 
    $p4->Connect();
        if($p4->ErrorCount()) {handle_p4_error();}
}
....etc....
exit;

sub handle_p4_err {
    print "<<<P4 ERROR>>>\n";
    foreach $err ($p4->Errors) {
        print "$err\n";
    }
exit;
}
使用P4;
我们的$p4=新的p4;
如果(!(未连接$p4)){
$p4->SetCwd($CWD”);
如果($p4->ErrorCount()){handle_p4_error();}
$p4->Connect();
如果($p4->ErrorCount()){handle_p4_error();}
}
等
出口
子句柄\u p4\u错误{
打印“\n”;
foreach$err($p4->Errors){
打印“$err\n”;
}
出口
}
或者SetCwd会因为缺少连接而失败吗

P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)

谢谢你的帮助

这是一个真正的错误吗(显然,连接被重置了?)

对,;与服务器的连接已终止

我可以忽略这个吗?重置连接后,它会运行我想要运行的东西吗

没有

还是需要重新运行该命令

对,;我认为您还需要首先重新打开连接

$p4->Connect();
    if($p4->ErrorCount()) {handle_p4_error();}
这是一般模式,尽管如果连接失败,您可能希望退出,因为在该点之后您所做的任何事情都不会起作用(在大多数情况下,这意味着配置错误)

或者SetCwd会因为缺少连接而失败吗

没有;这纯粹是客户端操作,不与服务器通信

P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)


这是一种可能性——您的脚本是否保持空闲连接打开?这被认为是不礼貌的行为,因为这些行为足以通过阻止任何新连接被打开而构成DDoS攻击。另一种可能是其他一些网络故障(VPN连接中断等)。

在我的特殊情况下,我认为问题与perl脚本中的fork有关。可能句柄被传递给了分叉进程,这会干扰在主进程线程中重新连接的尝试。我的DB连接也有类似的问题。补救办法也很相似


似乎有效的方法是在分叉之前无条件地断开P4的连接,然后在分叉之后无条件地重新连接。分叉进程不需要P4连接,因此这是可以的(在我的特殊情况下)。

在我的情况下,问题是我需要与perforce服务器建立ssh连接,但我没有添加正确的ssh密钥。您可以使用以下命令列出添加到会话中的ssh密钥:

ssh-add -L

谢谢山姆:测试的代码已经连接了吗?(顺便说一句,我在断开连接后忘记了“()”)?这看起来是检测丢失连接并建立新连接的好方法吗?(如果它不是NETWOKE问题或类似的事情)我不确定是否ISCONNED()会检测到错误情况,或者它是否只检查“干净”的连接中断——我知道在C++ API中,如果在重新打开连接之前有致命的错误,那么通常要检查错误和最终()。