如何将套接字复制到另一个变量

时间:2015-11-04 18:18:43

标签: perl sockets

我有一个后端服务器和提供不同服务的不同客户端。

在一个线程中,我等待传入的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。

我希望你能理解我的问题。

2 个答案:

答案 0 :(得分:0)

如果你正在使用IO::Socket,你宁愿使用包中的accept方法,如:

my $newSocket = $requestConnectionSocket->accept();

这将返回一个对象,我发现没有问题将该对象分配给不同名称的标量引用。

好的,您已使用上述代码更新了您的问题,现在:

  

Clippy suggests thread saftey
  看起来你正试图在线程中共享状态,你有没有计划线程安全?

# 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。这注定要失败。当一个线程收到一条新消息(并用它更新套接字)时会发生什么,但另一个线程仍在使用前一个套接字?不能这样做。