Delphi10.3.3CEのIndy10でIdUDPServerについて教えてください。
(しつこくてすみません)
Windowsにサーバ、Android2台をクライアントとして利用しています。
サーバ側の受信イベントUDPReadですが、
クライアントのどちらか最初に受信したほうしか続けて受信イベントが発生しません。
最初のクライアント送受信後、別のクライアントからの送信に対して受信イベントが発生しません。
(クライアントの順番を変えても同じでした)
クライアントの2台は同じアプリです。
説明が難しく表現力が乏しいですが。。。
何か事前に設定等が必要なのでしょうか?
質問ばかりですみません。
よろしくお願いいたします。
まずはWiresharkでキャプチャ
あとはクライアントをWindowsアプリで作って再現テスト
かな?
Wiresharkはまだですが、
「クライアントをWindowsアプリで作って再現テスト」は、結果はAndroidと同じでした。
関係ないと思いますが、AndroidはWifiでしたが、Windowsは有線LANです。
UDPって、ユーザー数(ユーザー用バッファ?)の設定のようなものはあるのかな?
(Indyでできるのか不明)
追伸
もしユーザー数の問題なら、readイベントでReleaseしたどうだろうと思ってやってみましたが結果は同じでした。
情報が少なくて想像になりますが
Windowsで作ったクライアントで動作するのであればサーバー側には問題無いと思います。
AndroidとWindowsでソース共通とはいきませんが、ほとんど違いはないと思って良いのですかね?
有線か無線かは関係無いと思いますが
先に通信した方が通信してしまうのであれば単純にIPアドレスの重複とか疑ってしまうのですがどうでしょうか?
あとサーバー側で接続制限はありません
制限があるのはWindowsファイル共有部分です。
>>先に通信した方が通信してしまうのであれば単純にIPアドレスの重複とか疑ってしまうのですがどうでしょうか?
IPアドレスの重複はないですね。
順序を変えてその都度ABinding.PeerIPでクライアントのIPアドレスを確認しています。
そもそもコネクションレスなんですから接続数も関係ないですよね。
ではAndroid用のTCP/IP UDPテストツールをインストールしてそれで試してください。
テストツールでは正常に動作する→クライアントソフトが原因
テストツールでも同様の現象→サーバーソフトまたは環境の問題
サーバーのソフトとかクライアントのソフトとかIndy使っていれば数行と思いますので
公開して頂ければわかるかと
Windowsのフリーソフトは意外とないのですがTCP/IPのテストツールは探せばありますので
WindowsとAndroid間の通信を確認する事は出来ます。
シンプルなソースを作って確認してみました。
原因がわかった(ような気がします)
UDPReadイベント内で送信元のクライアントに返信しています。
ABinding.Connect
ABinding.Send(~)
と記述しています。
Connectがないと「Socket エラー # 10057ソケットが接続されていません。」となりました。
Connectを追加したらエラーが解消され、送信元に届きました。
UDPでなんでConnect?って思ったのですが...
この2行を削除しましたところ、複数のクライアントから受信できました。
(しかし、このままではクライアントには何も伝わりません)
ABinding.Send(~) を使わずに、
IdUDPServer1.Send(ABinding.PeerIP. ~); とやっても同様に「# 10057エラー」になってしまいます。
UDPRead以外の他のイベント内ではConnectせずにsendできます。
受信データを送信元に返信をするためにはどのようにするのがよいでしょうか?
なーんかまた不勉強を露出してしまったようで恥ずかしいです。
理解していないのはわかるけどこちらの質問にほとんど答えずに新たに課題を持ってこられてもねぇ
とりあえず connect云々はよしとしてWindowsでほぼ同じソースで動作させたときは正常だったのですよね?
その部分も覆ってしまうのですが
あと私はWinsock API直接やりとりなので Indyはよくわかりませんが
軽く拝見したところ
Readイベントの引数でABindingってのが渡されるけどそこに接続してきたクライアントのIPアドレスとポート番号が入ってますよね?
で次にIdUDPServerの Sendメソッドの仕様を見ると
引数1:送信先IP
引数2:送信先ポート番号
引数3:送信データ
ってなってるからこれ組み合わせたら動くんじゃないの?
>>Windowsでほぼ同じソースで動作させたときは正常だったのですよね?
いいえ。
No: 148623に書きましたが、
「クライアントをWindowsアプリで作って再現テスト」は、結果はAndroidと同じでした。
の表現がまずかったようですみません。
結果はAndroidと同じで"ダメ"でした。 です。
>>Readイベントの引数でABindingってのが渡されるけどそこに接続してきたクライアントのIPアドレスとポート番号が入ってますよね?
合っています。
sendは問題なくクライアントに届いています。
本来の問題は、sendではなく、2台目のクライアントからの送信データが受信できない(UDPReadイベントが発生しない)ことです。
うまくい表現できずに、怒らせてしまってようでお詫び申し上げます。
最小限の再現ソースを作って提示してみては?
編集 削除UDPなのにTIdUDPServer/TIdUDPClientにConnect不要のsendtoがないのが気になっていました。
UDPReadイベント内のABindingにsendtoがあるのを見つけました。
ABinding.SendTo(~);
SendToなら前回の検証したようにConnect不要になったので、2台め以降のクライアントからの送信も受信(UDPReadイベント発生)できました。
いろいろありがとうございました。
お騒がせしました。