【发布时间】:2014-07-14 05:16:56
【问题描述】:
我正在制作一个与 Teamspeak 交互的程序,但我遇到了一个问题,即收到的响应与发送的命令不匹配。我多次运行该程序,每次,由于响应不同步,当它们应该相同时,我会得到不同的结果。
my $buf = '';
use IO::Socket;
my $sock = new IO::Socket::INET (
PeerAddr => 'localhost'
,PeerPort => '10011'
,Proto => 'tcp'
,Autoflush => 1
,Blocking => 1
,Timeout => 10
);
sub ExecuteCommand{
print $sock $_[0]."\n";$sock->sysread($buf,1024*10);
return $buf;
};
ExecuteCommand("login ${username} ${password}");
ExecuteCommand("use sid=1");
ExecuteCommand("clientupdate client_nickname=Idle\\sTimer");
my $client_list = ExecuteCommand("clientlist");
每个命令都正确执行,但是服务器喜欢返回额外的行,所以单个 sysread 是不够的,我必须执行另一个。响应的大小最多为 512,因此不会被截断。如果我尝试多次运行 sysread 以尝试刷新它,那么当没有可读取的内容时,它只会使程序挂起。
执行结束后跟“error id=0 msg=ok”
我如何能够读取所有输出的数据,即使它是多行的?或者只是能够将其全部清除,以便我可以继续执行下一个命令而不必担心旧数据?
【问题讨论】:
-
我正在运行一个循环,从 clientlist 生成的列表中检查每个客户端,但我得到了不属于列表的内容。所以如果我
print ExecuteCommand("clientinfo clid=1"),然后是print ExecuteCommand("clientinfo clid=2"),我将得到“错误代码=0”,而不是获取客户端信息。如果我然后运行 $sock->sysread($buf,1024*10);print $buf;我将从 clid=2 获取客户端信息