68user's page 掲示板

Prev< No. 1299〜1304> Next  [最新発言に戻る] [過去ログ一覧]
No. 1299 # ありさわ [E-mail] 2000/10/27 (金) 19:41:12
Perlのネットワークプログラムで、サーバーとの接続が
切れた状態を検出したいのですが、LANケーブルがつながった状態で
通信できなくなった状態は検出してPerlプログラムを終了出来るのですが
LANケーブルを引きぬくことによって、通信できなくなった状態はどのようにして検出したらよいのですか?

一応、Perlの中でPingをうって帰ってきた値を見て検出しようと
したのですが、Perlの中のPingはRoot権限でないとエラーに
なってしまいます。
Root権限以外でPingを実行する方法か、あるいは違う方法を
知っていたら教えて下さい。お願いします(v_v)

No. 1300 # 68user 2000/10/28 (土) 04:43:23
@宗佑さん
> "xxx@xxx.yyy.zzz"といった指定したメールアドレスを
> from句に入れて自動返信したいのです。
これは、単に From ヘッダが xxx@xxx.yyy.zzz になっていれば
いいのですか? それとも envelope from が xxx@xxx.yyy.zzz と
なっていて、例えば転送途中でメール送信に失敗した場合、
エラーメールが xxx@xxx.yyy.zzz に送られることを意図して
いますか?

前者ならただ単に From: を置換するだけなので、formail -i や
formail -I でできそうです。後者なら sendmail -f xxx@xxx.yyy.zzz
でしょうか。

なお、僕は formail を使ったことはありませんし、できるか
どうか試してもいません。


@やままさん
> MAX_CHILDRED -> ?
む、typo ですね。直しました。御指摘ありがとうございました。


@ありさわさん
ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で
タイムアウトさせて unreachable かどうかを判断すると思いますが、
本当はどうすべきなのかは わかりません。

それはそれとして、以下は ping で判断するという前提の話。
ping は ICMP プロトコルを使いますが、これは root 権限が
ないと実行できません。その証拠に ping コマンドは root に
suid されています。
    % ls -l /sbin/ping
    -r-sr-xr-x 1 root wheel 195956 Jul 27 23:31 /sbin/ping*
というわけで、素直 (?) にping コマンドを使うのがいいのでは
ないでしょうか。

No. 1301 # rosegarden 2000/10/30 (月) 01:00:45
>ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で
>タイムアウトさせて unreachable かどうかを判断すると思いますが、
>本当はどうすべきなのかは わかりません。

OS 依存ですが、ifconfig -a とすると表示されることがあります。
下は FreeBSD の場合です。

dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
                inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
                inet6 fe80::xxx:xxxx:xxxx:xxxx%dc0 prefixlen 64 scopeid 0x1
                ether xx:xx:xx:xx:xx:xx
                media: autoselect (none) status: no carrier
                supported media: autoselect 10baseT/UTP <full-duplex> 10baseT/UTP none

no carrier というのがケーブルが抜けたことを意味していると思っても
だいたいあたっているはずです。一方、Solaris のように抜けた瞬間に
/var/adm/messages などに記録されるものもあります。

Solaris がでたついでなので、

>1. /var/log/messages や /var/log/maillog に詳細なエラーは出ていないか

Solaris の場合 sendmail のログは通例 /var/log/syslog に記録され、
BSD の /var/log/messages にあたるものは /var/adm/messages です。

No. 1302 # ありさわ [E-mail] 2000/10/30 (月) 11:48:01
No.1299の ありさわ です。
いろいろご回答いただきありがとうございます。
掲示板に書き込みしたのが初めてだったので、
返答が有ったことにチョット感激してます。

この件については結果的に、僕の技術不足で違う方法によって
対処をすることになりましたが、今後のためにこの件について
前の書き込みで説明が足りなかった分の説明をさせていただきます。

切断を検出して子プロセスをKillする一連の作業は
コマンドラインからではなくPerlプログラム内で行いたいです。
ついでに何を作成したかというと、ここのサンプルプログラムを
利用してネットワーク対戦のロビーサーバーを作成しました。

Q.LANケーブルを抜いたらどうなるのか?
まずこれは、クライアント側のLANケーブルを抜いた時のことです。

※LANケーブルを抜いた時の様子
・最初にケーブルがつながった状態でサーバーに接続をしにいきます。
・サーバーはこのクライアントに対して子プロセスを作成します。
・接続が確立した状態でクライアントのケーブルを引きます。
・子プロセスはクライアントとの接続が切れたことを認識できず
    残ったままになります。
・この作業(嫌がらせ)を何度もされると子プロセスが溜まっていって
    結果、サーバーがダウンするんじゃないか?って思ってます。

あたたかいご回答、本当にありがとうございました。

No. 1303 # 宗佑 [E-mail] 2000/10/31 (火) 18:34:11
ありがとうございます。

formailによる自動返信完了しました。
errorメールに関しても、本文に細工をしてなんとか解決しています。
こういうことが、やりたかったのも、UNIXのアカウント名とメールアカウント名が、まったく一致しない仕様のシステムを使っているので、外部に対する送信者が誰であるかを混乱させないようにする目的があったからです。
ありがとうございました

No. 1304 # Taka@万年初心者 2000/11/02 (木) 21:22:20
はじめまして。
GOOで検索してきました。
perlの事について質問があるのですが。。。。

perlを使ってActiveXのDLLファイルを舐めようと思っているのですが、全くもって方法が解りません。
ここの過去ログや、その他色々探して見ましたがそれらしいものは見当たりませんでした。

どうぞお解りになる方がいらっしゃいましたら御指導宜しくお願いします。

Prev< No. 1299〜1304> Next  [最新発言に戻る] [過去ログ一覧]