4

I'm having a little trouble using sockets in a Perl server.

How can you know a (non-blocking) client just disconnected ? In C, I'm used to doing

if (recv(sock, buff, size, flags) == 0) {
    printf("Client disconnected\n";
}

or the equivalent in python or other languages : recv returns -1 if no data is available, 0 if client exited, a positive number if data could be read.

But perl's recv doesn't work this way, and using $data = <$sock> does not seem to give any possibility to know.

Is there any (simple) possibility ?

4

1 に答える 1

1

と を確認する必要がperldoc perlioありますperldoc IO::Socket

#!/usr/bin/perl -w
use IO::Socket;

PIPEシグナルから使用できるものまで、ノンブロッキング IO で構成する方法はたくさんありますrecv(何をしているかによって異なります)。

return "Socket is closed" unless $sock->connected;

それが、私が多くのソケットを制御してそれらを提供する方法selectです。ソケットが閉じられたら、リストからそれらを削除する必要があります (切断するかのように、ソケットはもう存在しないため、それらを閉じる必要はありません):

unless (eval {$group{$grp}->{'socket'}->connected}) {
    delete $group{$grp}->{'socket'};
    return 0;
};

これにより、ソケット io エラーevalでスクリプトが終了する切断されたソケットへの不正な試行が防止されます。

お役に立てれば!

于 2012-12-27T22:59:12.977 に答える