VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息

Posted

技术标签:

【中文标题】VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息【英文标题】:VB6 app sending UDP broadcast messages via winsock - only every second message is sent 【发布时间】:2013-05-31 07:31:02 【问题描述】:

我有一个 VB6 应用程序,其中我有一个功能,我通过发送 UDP 广播消息(到 255.255.255.255 或子网的广播地址 172.16.7.255/11)发送消息(以跟踪应用程序正在做什么) .该函数从应用程序的不同位置调用。

我有另一个应用程序在同一个端口上侦听并显示我认为可以正常工作的消息。

我可以在我的子网中的任何主机上运行发送应用程序和侦听器应用程序,并且似乎一切正常。但是,当我在 Windows 8 机器上运行发送应用程序时,我发现我只看到每秒的消息。我的消息恰好是编号的,基本上我只看到奇数编号的消息。

我已尝试通过以下方式消除一些可能的问题:

网络负载极小,在其他情况下我看不到任何数据丢失 消息非常小(每个不到 100 个字节) 当我在同一主机或来自发送应用程序的另一主机上运行侦听器时,我看到了相同的行为。 我可以将应用程序作为 .exe 或在 VB6 IDE 中运行。在 IDE 中,我可以跨过 winsock.SendData 行,我仍然可以看到每一秒消息都在悄悄消失 我尝试在发送后执行Sleep 和/或DoEvents 我尝试使用 winsock 事件 SendComplete 但我怀疑这些事件不是针对 UDP 引发的 我编写了另一个小型 VB6 应用程序,它只是以相同的方式发送多个 UDP 广播 - 在这种情况下,所有消息都由侦听器正确发送和接收。 在其他机器(仍在运行 XP)上运行应用程序正常 我想知道是否每条第二条消息都会发送到其他地方。这台机器只有一个网卡。 我已确认侦听器应用程序使用 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

关于可能出错的任何建议,或我可以做的进一步测试。

【问题讨论】:

和你发布的代码没有任何关系,UDP数据报在发送端不会丢失。很难猜测为什么它如此可重复,这个问题可能位于任何地方。如果您不喜欢丢失数据,请使用 TCP。 如果您在同一个 Windows 8 机器上运行这两个应用程序会发生什么?接收方是否看到所有数据?另外,您说您已确认侦听器应用程序与 WireShark 一起工作正常 - WireShark 是否也显示只有奇数消息会发出? 在我看到的 Win8 机器上运行我的主应用程序(它会丢失消息)和我的虚拟应用程序(在子网上的同一个或另一个盒子上使用我的监听器应用程序和 Wireshark)来自主应用程序的奇数消息和来自虚拟应用程序的所有消息。在 XP 机器上,相同的测试会提供来自两个应用程序的所有消息。感谢您的 cmets。 【参考方案1】:

我在 VBA 中遇到了类似的问题,访问 2010。唯一为我解决问题的是这个(我知道这没有任何意义)。重复此行两次:

Sock.RemoteHost = DestinationIP ( for example: "192.168.0.10")
Sock.RemoteHost = DestinationIP ( same value as in the above line)

它就像魔术一样工作:

【讨论】:

【参考方案2】:

尝试使用 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

【讨论】:

以上是关于VB6 应用程序通过 winsock 发送 UDP 广播消息 - 仅每秒发送一次消息的主要内容,如果未能解决你的问题,请参考以下文章

VB6:如何获取通过 winsock 发送的字节数?

使用 vb6 winsock 发送 python 字符串

VB6 中的默认 WinSock 协议

尝试使用 VB6 Winsock 连接到票务打印机

vb6 - 将消息发送到winsock服务器聊天

winsock多IP发送数据vb6