UDPで4D Serverを検出するメソッド
日付 | 2011/08/10 |
---|---|
ID | 76381 (英語原文参照) |
バージョン | v12 |
プラットフォーム | Mac/Win |
この記事は、最新ではないバージョンに関連した方法について解説しています。
最新のバージョンでは推奨されていないか、または他の方法で簡単に実現できる可能性があります。
4D Serverにログインの準備ができていることは, ネットワークのブロードキャストを受信することで検出することができます。サーバーのUDPパケットは, バージョン2004以前は"4D Server 6.5", バージョン11以降が"4D Server II"となっています。下記のメソッドは, $1に検出したいサーバーのバージョン, $2にネットワークアドレスあるいはホスト名, $3にポート番号を渡して使用されることが想定されています。
ARRAY STRING(255;asHost;0) ARRAY STRING(32;asMachineName;0) ARRAY STRING(32;asService;0) ARRAY STRING(32;asDBName;0) Broadcasting4DServers( "2004" | "11" | "12" ; "nnn.nnn.nnn.nnn" ; 19813\ ->asHost\ ->asMachineName\ ->asService\ ->asDBName)
//Broadcasting4DServers Method C_TEXT($Vers_T;$1) C_TEXT($Addr;$2) C_LONGINT($Port;$3) C_POINTER({$4}) C_LONGINT($udpID;$Offset;$Build_L;$Vers_L;$Secs;$Err;$Timeout;$Port;$Offset;$Pos) C_TEXT($ServerStr_T;$PeerAddr;$Host;$Service;$DBName) C_BLOB($Blob) C_POINTER($Host_aP;$MachineName_aP;$Service_aP;$DBName_aP) $Vers_T:=$1 $Addr:=$2 $Port:=$3 $Host_aP:=$4 $MachineName_aP:=$5 $Service_aP:=$6 $DBName_aP:=$7 If ($Vers_T="2004") // 4D Server 2004 and earlier // $ServerStr_T:="4D Server 6.5" Else // 4D Server v11 and later // $ServerStr_T:="4D Server II" End if $Offset:=32 SET BLOB SIZE($Blob;96;0) TEXT TO BLOB($ServerStr_T;$Blob;Mac text without length;$Offset) $Err:=UDP_New (0;$udpID) $Err:=UDP_SendBLOBTo ($udpID;$Addr;$Port;$Blob) $Secs:=2 $Timeout:=Milliseconds+($Secs*1000) Repeat DELAY PROCESS(Current process;6) //... in ticks SET BLOB SIZE($Blob;0;0) $PeerAddr:=$Addr $Err:=UDP_ReceiveBLOBFrom ($udpID;$PeerAddr;$Port;$Blob) If (BLOB size($Blob)>0) $Offset:=0 $Host:=BLOB to text($Blob;Mac C string;$Offset;32) $Offset:=32 $Service:=BLOB to text($Blob;Mac C string;$Offset;32) $Offset:=64 $DBName:=BLOB to text($Blob;Mac C string;$Offset;32) $Pos:=Find in array(asMachineName;$Host) If ($Pos<0) APPEND TO ARRAY($Host_aP->;$PeerAddr) APPEND TO ARRAY($MachineName_aP->$Host) APPEND TO ARRAY($Service_aP->;$Service) APPEND TO ARRAY($DBName_aP->;$DBName) End if End if Until ((Milliseconds>$Timeout) | ($Err#0)) $Err:=UDP_Delete($udpID)