3

UDP ブロードキャスト メッセージ (255.255.255.255 またはサブネットのブロードキャスト アドレス 172.16.7.255/11) を送信することにより、メッセージを送信する関数 (appl が何をしているかをトレースするため) を持つ VB6 appl があります。関数は、アプリ内のさまざまな場所から呼び出されます。

同じポートでリッスンし、正常に動作すると思われるメッセージを表示する別のアプリがあります。

サブネット内の任意のホストで送信アプリとリスナー アプリを実行でき、すべて正常に動作しているようです。ただし、Windows 8 ボックスで送信アプリを実行すると、1 秒おきのメッセージしか表示されないことがわかります。私のメッセージにはたまたま番号が付けられていて、基本的には奇数番号のメッセージしか表示されません。

次の方法で、考えられる多くの問題を排除しようとしました。

  • ネットワークの負荷は最小限であり、他の条件下ではデータの損失は見られません
  • メッセージは非常に小さい (それぞれ 100 バイト未満)
  • 送信側アプリから同じホストまたは別のホストでリスナーを実行すると、同じ動作が見られます。
  • アプリは .exe または VB6 IDE で実行できます。IDE では、winsock.SendData 行をステップ オーバーできますが、1 秒ごとのメッセージが静かに蒸発していることがわかります。
  • 送信後にSleepand/orを実行しようとしましたDoEvents
  • Winsock イベント SendComplete を使用しようとしましたが、これらは UDP に対して発生していないと思われます
  • 同じ方法で多数の UDP ブロードキャストを単純に送信する別の小さな VB6 アプリを作成しました。この場合、すべてのメッセージがリスナーによって正しく送受信されます。
  • (まだXPを実行している)他のマシンでアプリを実行しても問題なく動作します
  • 毎秒のメッセージが別の場所に送られているのではないかと思いました。マシンには 1 つの NIC しかありません。
  • WireShark を使用して、リスナー アプリケーションが正常に動作することを確認しました。

関連するコードは次のとおりです。

Private WithEvents sock As Winsock
Public Sub Init()
    Set sock = new Winsock
End Sub
Public Sub Send(msg As String)
    sock.RemoteHost = "255.255.255.255"
    sock.RemotePort = 17907
    sock.SendData msg
End Sub

何がうまくいかないのか、または私ができるさらなるテストに関する提案。

4

2 に答える 2

0

Bindを使用して、アプリのローカル ポートを設定してみてください。

Private WithEvents sock As Winsock
Public Sub Init()
    Set sock = new Winsock
    sock.Bind 17000 'Or any other high port
End Sub

Public Sub Send(msg As String)
    sock.RemoteHost = "255.255.255.255"
    sock.RemotePort = 17907
    sock.SendData msg
End Sub
于 2013-08-02T12:44:12.353 に答える