2

As the Title already says im looking for a way, to get notified when a client closes his Session unnormal.

I'm using the freeBSD OS. The server is running with Xamount threads (depending on CPUcore amount). So I'm not forking, and there isn't a own process for each client.

That's why sending an deathpackage all time_t seconds, to recive a SIGPIPE isn't an option for me. But i need to remove left clients from the kqueue, because otherwise after too many accept()'s my code will obviously run into memory troubles.

Is there a way, I can check without high performance loose per client, they are connected or not?

Or any event-notification, that would trigger if this happens? Or maybe is there a way of letting a programm send any signal to a port, even in abnormal termination case, before the Client process will exite?

4

2 に答える 2

1

編集:kqueueの使用に関するものではないため、その答えは質問を見逃しています。しかし、他の誰かがタイトルで質問を見つけた場合、とにかく役立つかもしれません...

私はよく次のような振る舞いを見てきました: クライアントが死んで、サーバーがselect()クライアントのソケット記述子に対してa を実行するとselect()、戻りコード > 0 で戻りFD_ISSET( fd )、その記述子に対して true になります。しかし、ソケットから読み取ろうとするとread()(またはrecv()) ERROR が返されます。

それを使用してクライアントの死を検出する「通常の」接続では問題なく動作しますが、ソケット接続がトンネリングされている場合は異なる動作があるようですが、まだ完全には把握できていません。

于 2013-08-09T11:29:17.317 に答える
0

kqueue man pageによるとkevent()、ソケットがシャットダウンしたときにイベントを作成する必要があります。th filter の説明からEVFILT_READ

EVFILT_READ

記述子を識別子として取り、読み取り可能なデータがある場合はいつでも戻ります。フィルタの動作は、記述子のタイプによって若干異なります。

ソケット

以前に listen() に渡されたソケットは、保留中の着信接続がある場合に戻ります。data にはリッスン バックログのサイズが含まれます。

他のソケット記述子は、ソケット バッファーの SO_RCVLOWAT 値に従って、読み取るデータがある場合に戻ります。これは、fflags で NOTE_LOWAT フラグを設定し、data で新しい低水位標を指定することにより、フィルタが追加されるときにフィルタごとの低水位標で上書きされる場合があります。返されるとき、 data には読み取り可能なプロトコル データのバイト数が含まれます。

ソケットの読み取り方向がシャットダウンした場合、フィルターは EV_EOF をフラグに設定し、(もしあれば) ソケット エラーを fflags に返します。 ソケット バッファに保留中のデータがまだある間に、(接続が切断されたことを示す) EOF が返される可能性があります。

于 2013-08-09T14:46:11.950 に答える