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)