設定データを取得するには?

解決


もうすぐ中級者  2009-06-20 02:57:25  No: 34858

ネットワーク上に複数のPCがつながっているとします。
そのうちの一台がメインでそのほかがサブだとします。

現在わたしのスキルでは、

メインで設定した設定データ(すべてにおいて共通の設定データ)を
ファイルにしてネットワーク上のサーバーに保存して。
各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
読込んでもらうというものですが、伝えられなかったり、間違った
ファイルを読込まれたりする可能性があるので、

ブロードキャストアドレスのように、すべてのPCに対して
信号とかをネットワーク上に1度に送って、
メインPCがそれを受け取ったら設定内容を送り返して、
信号を送ったPCが受け取るといったようなことって
できませんか?
やっぱり、この方法でもサーバー名を指定しないとネットワーク通信して
情報を受け取ることはできないのでしょうか?


んー  2009-06-20 07:57:57  No: 34859

>この方法でもサーバー名を指定しないとネットワーク通信して情報を受け取る
>ことはできないのでしょうか?
そりゃTCP/IPで通信を行う以上は、設定しないとダメですよね。

>各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
>読込んでもらうというものですが、伝えられなかったり、間違った
>ファイルを読込まれたりする可能性があるので、
サーバー名って固定じゃないんですか?
ファイル名も固定してクライアントから定期チェックさせるようにするとか。


udp  2009-06-20 08:15:17  No: 34860

>ブロードキャストアドレスのように、すべてのPCに対して
>信号とかをネットワーク上に1度に送って、
>メインPCがそれを受け取ったら設定内容を送り返して、
>信号を送ったPCが受け取るといったようなことって
>できませんか?

UDPでどうです。


KHE00221  2009-06-20 12:43:30  No: 34861

>各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
>読込んでもらうというものですが、伝えられなかったり、間違った
>ファイルを読込まれたりする可能性があるので、

サーバー・ファイルが固定じゃないとするならば

固定サーバーとテキストファイルを用意する
そのテキストファイルにサーバーとファイル名を記述する
各担当者にはそのファイルの内容を参考に読んでもらう

DELPHI の話はどこにいったのか・・・


もうすぐ中級者  2009-06-24 01:09:22  No: 34862

すみません。
まだ、初級なのでよくわかってないのですが、
サーバー上にクライアントからなんらかのデータを送ってもらい
それをきっかけにそのクライアントに私はここですよ(ホスト名)という
情報が返せるアプリケーションを走らせておいて、
クライアントはネットワーク上のPC(サーバーを含む)から
該当のサーバーの名前とかIPアドレスとかがどこにあるか意識しないでも
常にサーバーのデータを読み取れるんじゃないかなと思ったのですが
もし、それができるのであれば
Delphiでどうやって作ったらいいのかなぁ?
という話で・・・・
Delphiにまでたどり着いてない状況ですね。
すみません。

udpさんのUDPを使うとできるということなので
UDPを調べてみます。


KHE00221  2009-06-24 11:59:35  No: 34863

>メインで設定した設定データ(すべてにおいて共通の設定データ)を
>ファイルにしてネットワーク上のサーバーに保存して。
>各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
>読込んでもらうというものですが、伝えられなかったり、間違った
>ファイルを読込まれたりする可能性があるので、

これは

6/10 Aさん 192.168.1.1 から A.TXT  Bさん 192.168.1.2 から B.TXT
6/11 Aさん 192.168.1.3 から X.TXT  Bさん 192.168.1.1 から C.TXT

のように毎回 アドレス、ファイル名が変わる可能性があるってこと?


もうすぐ中級者  2009-07-22 19:12:12  No: 34864

ちょっと時間がかかっていますが
以下のサイトを参考にして
UDPのプログラムを作成しています。

http://www.geekpage.jp/programming/winsock/udp.php

通信はできたと思います。

で、これをブロードキャストにして送信受信をするのですが

1.[クライアント]起動
2.[サーバー]    起動  スレッド上で Recv() 待機
3.[クライアント]ブロードキャスト(255.255.255.255)で
      メッセージ('データ頂戴')送信して、Recv() で待機
4.[サーバー]    Recv() でメッセージ('データ頂戴')を
      受信し、Send()でデータ文字列を送信
5.[クライアント]Recv() でデータ文字列を受信

と、こんなかんじでデータやり取りしているのですが、
サーバーからクライアントにメッセージを送るのも
ブロードキャストで送っています。
できれば、サーバー側の addr.sin_addr.S_un.S_addr には
クライアントのIPアドレスを設定したいのですが
どうすればよいですか?


それって  2009-07-23 09:38:36  No: 34865

4のところでクライアントに自分のIPを送信させればよいのでは?


  2009-07-23 10:45:10  No: 34866

>それって 2009/07/23(木) 00:38:36 
さんの言われるようにサーバーからIPアドレスを
貰うのがよいと思います。私も大した知識はありませんが
今回の用途だと
sendto
recvfrom
の方が使いやすくないですか?

http://www.geekpage.jp/programming/winsock/broadcast.php

今更言うなという感じになってしまいますが。
というかsendでブロードキャストが出来るのを知らなかったへたれです。


もうすぐ中級者  2009-07-23 20:10:03  No: 34867

手続き的には以下のようにすればいいと
いうことがわかりました。

1.Server(192.168.1.1)起動
  受信用ソケットを作成し、receiveで待機
2.Client(192.168.1.2)起動
  送信用ソケットを作成
3.Client→Server 文字列[Get data 192.168.1.2]を
  ブロードキャストで送信(Send)
4.Client(192.168.1.2)で受信用ソケット作成し、
  receive待機
5.Server(192.168.1.1)で文字列 [Get data 192.168.1.2]を受信
  IPアドレス(192.168.1.2)を取得
6.Server(192.168.1.1)でIPアドレス[192.168.1.2]への
  送信用ソケット作成
7.Server(192.168.1.1)でに[Data・・・]をSend
8.Client(192.168.1.2)の受信(Receive)で[Data・・・]を受信

最初、3で[Get data]だけを送り、5をしないで
6で、ブロードキャストで送り返そうとしていました。
作ってる最中、バグにより無限にループしたりしておかしくなったので、
ちょっと危険かなと思ったので、送り返す相手は固定にしようと考えました。

そこで、パケットの中に、送信元のIPアドレスが入っているなら
何らかの方法でアドレスを取得しようと思って質問を
させていただきました。

結局方法がわからないので、3でClientからServerにIPアドレスを
含む文字列を送信し、文字列から送信元のIPアドレスを
取得するようにします。ということで解決にしたいと思いますが、

最後に、WinSockの関数やプロパティなどでこのIPアドレスが
取得できる方法があるのであれば、その方法を教えてください。

上記のやり方で再度プログラムを作成しますが、
また、わからなくなったらお力をお貸しください。
ありがとうございました。


TS  2009-07-24 06:04:29  No: 34868

>IPアドレスが取得できる方法

私はFusaさんのNetworkUnitを使わせて貰っています。
感謝してます。
http://delfusa.main.jp/delfusafloor/opensource/delfusa_library_f.html


  2009-07-24 09:04:17  No: 34869

recvfromについては調べて頂けないのですね。

http://cai.int-univ.com/sugsi/Lecture/NetProg/chapter3/recv.html

5番目の引数なんですが。
from [out]
An optional pointer to a buffer in a sockaddr structure that will hold the source address upon return.


TS  2009-07-24 17:16:20  No: 34870

>5番目の引数なんですが。
これのことですか。
ServerSockAddr: TSockAddrIn;
下記に使用されていました。

http://www.geocities.jp/teamhasebe/pasocom/prgrming/delphi/tips/sntp.htm

接続してきたクライアントのIPアドレスとポート番号をこれで
知ることができるのでしたらこの方が今回の目的にあっていますね。


もうすぐ中級者  2009-07-28 01:18:02  No: 34871

使い方がややこしくって時間かかりましたけど。
いろいろ調べていって、receivefrom で取れました。
ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加