ネットワーク上に複数のPCがつながっているとします。
そのうちの一台がメインでそのほかがサブだとします。
現在わたしのスキルでは、
メインで設定した設定データ(すべてにおいて共通の設定データ)を
ファイルにしてネットワーク上のサーバーに保存して。
各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
読込んでもらうというものですが、伝えられなかったり、間違った
ファイルを読込まれたりする可能性があるので、
ブロードキャストアドレスのように、すべてのPCに対して
信号とかをネットワーク上に1度に送って、
メインPCがそれを受け取ったら設定内容を送り返して、
信号を送ったPCが受け取るといったようなことって
できませんか?
やっぱり、この方法でもサーバー名を指定しないとネットワーク通信して
情報を受け取ることはできないのでしょうか?
>この方法でもサーバー名を指定しないとネットワーク通信して情報を受け取る
>ことはできないのでしょうか?
そりゃTCP/IPで通信を行う以上は、設定しないとダメですよね。
>各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
>読込んでもらうというものですが、伝えられなかったり、間違った
>ファイルを読込まれたりする可能性があるので、
サーバー名って固定じゃないんですか?
ファイル名も固定してクライアントから定期チェックさせるようにするとか。
>ブロードキャストアドレスのように、すべてのPCに対して
>信号とかをネットワーク上に1度に送って、
>メインPCがそれを受け取ったら設定内容を送り返して、
>信号を送ったPCが受け取るといったようなことって
>できませんか?
UDPでどうです。
>各PCの担当者にサーバー名とファイル名を伝えてファイルからデータを
>読込んでもらうというものですが、伝えられなかったり、間違った
>ファイルを読込まれたりする可能性があるので、
サーバー・ファイルが固定じゃないとするならば
固定サーバーとテキストファイルを用意する
そのテキストファイルにサーバーとファイル名を記述する
各担当者にはそのファイルの内容を参考に読んでもらう
DELPHI の話はどこにいったのか・・・
すみません。
まだ、初級なのでよくわかってないのですが、
サーバー上にクライアントからなんらかのデータを送ってもらい
それをきっかけにそのクライアントに私はここですよ(ホスト名)という
情報が返せるアプリケーションを走らせておいて、
クライアントはネットワーク上のPC(サーバーを含む)から
該当のサーバーの名前とかIPアドレスとかがどこにあるか意識しないでも
常にサーバーのデータを読み取れるんじゃないかなと思ったのですが
もし、それができるのであれば
Delphiでどうやって作ったらいいのかなぁ?
という話で・・・・
Delphiにまでたどり着いてない状況ですね。
すみません。
udpさんのUDPを使うとできるということなので
UDPを調べてみます。
>メインで設定した設定データ(すべてにおいて共通の設定データ)を
>ファイルにしてネットワーク上のサーバーに保存して。
>各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
のように毎回 アドレス、ファイル名が変わる可能性があるってこと?
ちょっと時間がかかっていますが
以下のサイトを参考にして
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アドレスを設定したいのですが
どうすればよいですか?
4のところでクライアントに自分のIPを送信させればよいのでは?
>それって 2009/07/23(木) 00:38:36
さんの言われるようにサーバーからIPアドレスを
貰うのがよいと思います。私も大した知識はありませんが
今回の用途だと
sendto
recvfrom
の方が使いやすくないですか?
http://www.geekpage.jp/programming/winsock/broadcast.php
今更言うなという感じになってしまいますが。
というかsendでブロードキャストが出来るのを知らなかったへたれです。
手続き的には以下のようにすればいいと
いうことがわかりました。
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アドレスが
取得できる方法があるのであれば、その方法を教えてください。
上記のやり方で再度プログラムを作成しますが、
また、わからなくなったらお力をお貸しください。
ありがとうございました。
>IPアドレスが取得できる方法
私はFusaさんのNetworkUnitを使わせて貰っています。
感謝してます。
http://delfusa.main.jp/delfusafloor/opensource/delfusa_library_f.html
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.
>5番目の引数なんですが。
これのことですか。
ServerSockAddr: TSockAddrIn;
下記に使用されていました。
http://www.geocities.jp/teamhasebe/pasocom/prgrming/delphi/tips/sntp.htm
接続してきたクライアントのIPアドレスとポート番号をこれで
知ることができるのでしたらこの方が今回の目的にあっていますね。
使い方がややこしくって時間かかりましたけど。
いろいろ調べていって、receivefrom で取れました。
ありがとうございます。
ツイート | ![]() |