perlでsocket関数で、任意のサーバーの稼動/不稼動をチェックするプログラムを書いています(以前ここで教えていただいた方法)。稼動しているサーバーはすぐにOKが返ってきますが、稼動していないサーバーはsocketのタイムアウトに20秒くらい時間がかかります。このタイムアウト時間を3秒ほどに縮めたいのですが方法を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/06/06 14:35:22
  • 終了:--

回答(4件)

id:nyori3 No.1

nyori3回答回数21ベストアンサー獲得回数02004/06/06 14:47:27

ポイント20pt

socket生成の後、システムコールでsokcetのタイムアウト時間を変更できます。

setsockoptで、SO_RCVTIMEOの値を3秒になるように調整してみてはいかがでしょうか?

id:dayofgreen

ありがとうございます。setsockoptで与えるソケットのオプションの一覧や解説はありませんでしょうか。

2004/06/06 15:11:34
id:tahishi No.2

tahishi回答回数30ベストアンサー獲得回数02004/06/06 14:57:32

ポイント20pt

こんなのありました。これでtimeout短くできるとおもいます。

id:dayofgreen

ありがとうございます。参考になりま。しかし、ソースも見ましたが、タイムアウトの設定はされていないようですね。

2004/06/06 15:19:17
id:aki73ix No.3

aki73ix回答回数5224ベストアンサー獲得回数272004/06/06 16:27:10

ポイント20pt

Socket関数のconnectのタイムアウトはレンタルサーバ側の設定なので、直接いじれなかったかと思います

これは、予測なのですが、複数のShouCastサーバをScanしたいということであれば、iframeタグで、CGIを呼び出してみてはいかがでしょうか?

-----------------------------

#!/usr/local/bin/perl

$mthd=$ENV{’REQUEST_METHOD’};

local($qu,@in,$key,$val);

if($mthd eq ’GET’){

$qu=$ENV{’QUERY_STRING’};

}

elsif($mthd eq ’POST’){

read(STDIN,$qu,$ENV{’CONTENT_LENGTH’});

}

*query = decode();

$host=$query{”host”};

$port=$query{”port”};

$addr = (gethostbyname($host))[4];

$file = ’/’;

$name = pack(”S n a4 x8”, 2,$port, $addr);

socket(S, 2, 1, 0);

$afx=connect(S, $name);

close(S);

print qq(Content-type: text/html¥n¥n);

print ”<html><body>¥n”;

print $host.”[”.$port.”]”;

if($afx == 1){

print ”OK”;

}

else{

print ”error”;

}

print ”</body><html>¥n”;

exit;

sub decode

{

local(@query)=split(/&/,$qu);

foreach(@query){

tr/+/ /;

($key,$val)=split(/=/);

$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;

$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;

$val=~s/¥r¥n/¥n/g;

$vin{$key}=$val;

}

return *vin;

}

id:dayofgreen

ありがとうございます。サンプルまで書いていただき感謝です。レンタルサーバーに限界があったので、今、自分のサーバーで試しています。まさにiframeで入れようという魂胆です。setsockoptのオプションの一覧があればお願いします。

2004/06/06 16:42:37
id:aki73ix No.4

aki73ix回答回数5224ベストアンサー獲得回数272004/06/06 17:21:59

ポイント20pt

>setsockoptのオプションの一覧があればお願いします。

だからTIMEOUT無理なんですけどね^^;

一応下のがそうです・2個目は日本語のLinuxリファレンスより

SO_DEBUG

enables recording of debugging information

SO_REUSEADDR

enables local address reuse

SO_KEEPALIVE

enables keep connections alive

SO_DONTROUTE

enables routing bypass for outgoing messages

SO_LINGER

linger on close if data present

SO_BROADCAST

enables permission to transmit broadcast messages

SO_OOBINLINE

enables reception of out-of-band data in band

SO_SNDBUF

set buffer size for output

SO_RCVBUF

set buffer size for input

SO_SNDLOWAT

set minimum count for output

SO_RCVLOWAT

set minimum count for input

SO_SNDTIMEO

set timeout value for output

SO_RCVTIMEO

set timeout value for input

SO_TYPE

get the type of the socket (get only)

SO_ERROR

get and clear error on the socket (get only)

id:dayofgreen

ありがとうございます。SO_SNDTIMEO, SO_RCVTIMEOはこれに該当しないのでしょうか。ちなみに今は自分のサーバーなので、OSの設定もいじれます(Windows XPですが)

2004/06/06 19:34:56

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません