- 題名: ライセンスがある場合の端末の管理?
- 日時: 2007/06/16 3:14:47
- ID: 19854
- この記事の返信元:
- (なし)
- この記事への返信:
- [19860] Re[1]: ライセンスがある場合の端末の管理?2007/06/17 9:24:04
- ツリーを表示
■No19861に返信(ちとせさんの記事) なんにせよ、サーバー側で管理するプログラムは必要そうですね。 通信については初心者なんですが、今のボクが実現できそうな案を 書いてみます。 System.Runtime.Remoting あたりを使います。ボクがやったときは [VB.NET2003]の本を見たので、WEBの資料を用意できませんが、 http://support.microsoft.com/kb/300943/ja あたりの話です。 System.Runtime.Remoting.Channels.Tcp を利用してサーバー上の サービスから値を取得します。 DBの管理用テーブルのフィールドは、[端末名][ログインフラグ] を用意します。 ・サーバーで接続数管理用のサービスを用意。 ・クライアントはログイン時、サービスに自端末名を送信。 ・サービスは端末名が新規なら登録、[ログインフラグ]を カウントし、ログイン許可・不許可を戻り値で返します。 ・ログイン許可した端末の[ログインフラグ]を立てます。 ・ログイン中、クライアントは一定時間(10秒とか)ごとに サービスにログイン継続中の情報(自端末名)を送ります。 ・サービスは、一定時間(3分とか)クライアントから ログイン継続中の情報が来ないとログアウトしたと見なし、 [ログインフラグ]を戻します。
■No19861に返信(ちとせさんの記事) > YASさんありがとうございました。 > しかし、あんまりUDPに関して良く分かっておりません。 > もう少し詳しく教えていただけたら光栄です。 > 一応、インターネットで確認してみました。 > TCPより軽いのがうりだとか・・・ > C#で簡単に書けるものなのでしょうか・・・ > 明日、ちょっと試みてみます。 例えば次のようなコードを各PCに仕込んでおいて,起動時に「Hello!」を 送信し,各PCからコンピュータ名が返されるのでその数を数えるというのは どうでしょう? Imports system.net.sockets Imports system.Net Imports System.Text Imports System.Threading Public Class Form1 Private Udp As UdpClient Private UdpListenerThread As Thread Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click UDPSender("Hello!") End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'UDPをマルチスレッドで受信する UdpListenerThread = New Thread(AddressOf UDPListener) UdpListenerThread.IsBackground = True UdpListenerThread.Start() End Sub Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing '受信スレッド終了 If Not IsNothing(Udp) Then Udp.Close() '受信スレッドは例外で終了する End If '受信スレッド終了の確認 If Not IsNothing(UdpListenerThread) AndAlso Not UdpListenerThread.Join(1000) Then '終了が確認できないときは強制終了 UdpListenerThread.Abort() End If End Sub 'UDPでマルチキャストアドレスに送信する 'マルチキャストアドレス224.168.1.1 ポート11000 Public Sub UDPSender(ByVal s As String) Dim GrpAdd As IPAddress = IPAddress.Parse("224.168.1.1") Dim GrpPort As Integer = 11000 Dim GrpEP As New IPEndPoint(GrpAdd, GrpPort) Dim UdpSender As New UdpClient Try Dim Bytes As Byte() = Encoding.UTF8.GetBytes(s) UdpSender.Send(Bytes, Bytes.Length, GrpEP) UdpSender.Close() Catch ex As Exception If Not IsNothing(UdpSender) Then UdpSender.Close() End If End Try End Sub 'UDPでマルチスレッドアドレスから受信する 'マルチキャストアドレス224.168.1.1 ポート11000 Private Sub UDPListener() Dim GrpAdd As IPAddress = IPAddress.Parse("224.168.1.1") Dim GrpPort As Integer = 11000 Dim grpEP As New IPEndPoint(GrpAdd, GrpPort) Dim Res As String Udp = New UdpClient(11000) Try Udp.JoinMulticastGroup(GrpAdd) 'マルチキャストグループに参加する Do Dim Bytes As Byte() = Udp.Receive(grpEP) Res = Encoding.UTF8.GetString(Bytes, 0, Bytes.Length) If Res = "Hello!" Then UDPSender(My.Computer.Name) End If Debug.Print(Res) Loop Catch ex As Exception If Udp IsNot Nothing Then Udp.Close() End Try End Sub End Class
分類:[.NET]
少しC#のプログラムの質問とは、違うかもしれませんが、何か良いアイディアを
教えていただけたら光栄です。
あるソフトを使用できる同時接続のライセンスが10個で、
それに対しそのソフトが入っているパソコンが15台の環境に、
それぞれの端末でC#のプログラムがそのソフトを起動するのですが、
プログラムで、ログイン画面の個所で、テーブルを見に行き、
ライセンスの違反にならないように制御を掛ける仕様書を書きました。
仕様は、あるテーブルにMACHINE_ID,ONというフィールドを作成し、
マシン分のデータを作成し、今回なら15データ。
MACHINE_IDには、それぞれの端末ID。
ONには、接続をしていた場合、フィールドをtrueにし、ログアウトした場合、falseにするという風にしました。
しかし、いざ仕様書を提出すると上司に、
・ある端末でログイン中に電源が落ちた場合はどうするのだ?フィールドがONになったままではないのか?
・端末が増えた場合、そのたびにわざわざお客様の所にいって、データを足すのか?
と言われてしまいました。
確かに上司の言っている事はあっています。
しかし、私の考えではそれ以上よいアイディアが浮かびませんでした。
ライセンス違反をしないように作りこむ何か良い技は無いでしょうか?
いろいろな企業で働いている方でこんな状況に陥った事とかは無いでしょうか?
何でも良いので何かあればよろしく御願いします。