我有一个后端服务器和提供不同服务的不同客户端。
在一个线程中,我等待传入的TCP连接。然后他们应该发送消息,告诉他们是什么类型的机器人或前端。
在后端我现在等待连接并检查它们是什么类型,并且根据我希望它被复制到例如$ frontendSocket:
$requestConnectionSocket = new IO::Socket::INET(...);
$frontendSocket;
sub waitForConnection {
threads->create(sub {
while(1){
$newSocket = $requestConnectionSocket->accept();
$newSocket->recv($message, 1024);
if ($message eq "Frontend")
{
$frontendSocket = $newSocket;
$frontendSocket->send("hello\n");
}
if ($message eq "Roboter")
{$robotSocket = $newSocket;}
if ($message eq "Sensor")
{$sensorSocket = $newSocket;}
}
});
}
当我编写脚本时,在此线程中我可以发送消息“hello”。但是当我想在外面使用套接字时,我无法使用$ frontendSocket。
我希望你能理解我的问题。
答案 0 :(得分:0)
如果你正在使用IO::Socket
,你宁愿使用包中的accept
方法,如:
my $newSocket = $requestConnectionSocket->accept();
这将返回一个对象,我发现没有问题将该对象分配给不同名称的标量引用。
好的,您已使用上述代码更新了您的问题,现在:
# http://perldoc.perl.org/threads/shared.html
use threads;
use threads::shared;
...
my ($requestConnectionSocket, $frontendSocket, $robotSocket, $sensorSocket) :shared;
sub waitForConnection {
threads->create(sub {
while(1){
my $newSocket;
{
lock($requestConnectionSocket);
$newSocket = $requestConnectionSocket->accept();
}
$newSocket->recv($message, 1024);
if ($message eq "Frontend")
{
lock($frontendSocket);
$frontendSocket = $newSocket;
$frontendSocket->send("hello\n");
}
if ($message eq "Roboter")
{lock($robotSocket); $robotSocket = $newSocket;}
if ($message eq "Sensor")
{lock($sensorSocket); $sensorSocket = $newSocket;}
}
});
}
... meanwhile, in another context ...
# I have front end work to do now, figure out if I need to lock or wait and on what.
答案 1 :(得分:0)
您有多个线程访问同一个frontendSocket。这注定要失败。当一个线程收到一条新消息(并用它更新套接字)时会发生什么,但另一个线程仍在使用前一个套接字?不能这样做。