VB.net编写一个通过UDP通讯的小软件出现Bug,只能发送不能接收,求助! 50
我使用VB.net写了一个建议的上位机程序,通过UDP和TCP向其他硬件交换数据,但在编写程序时遇到了一个奇怪的问题:上位机可以通过UDP向外发送数据,但却无法接收数据。...
我使用VB.net写了一个建议的上位机程序,通过UDP和TCP向其他硬件交换数据,但在编写程序时遇到了一个奇怪的问题:上位机可以通过UDP向外发送数据,但却无法接收数据。接收数据时,发送数据的是一个硬件模块,与电脑在同一个子网内,模块以大约每秒10次的频率发送UDP数据包(内容是几个字符),测试了很长时间已经发送了一百多万个数据包了,但电脑的上位机一个都没收到,通过“网路岗”抓包软件在电脑上能够看到这些UDP数据包,一个叫“网络调试助手”的小工具在电脑上也能正常接收这些数据,唯独我自己写的上位机收不到,不知为何,请高手帮忙看一下。下面是发送和接收部分代码:(本人并非计算机专业毕业,没有受过专门的VB编程培训,完全自学的,如果有低级错误,请勿嘲讽,谢谢)Imports System.NetImports System.Net.SocketsImports System.TextModule ProtocolModule '传输协议控制模块 Public Const MyName As String = "PC_TestDevice" Public Const MaxPackNum As UInt16 = 255 '最大数据块数量 Public Const MaxPackSize As UInt16 = 255 '最大数据块尺寸 Public SendPackBuf(MaxPackNum, MaxPackSize) As Byte '发送数据包缓冲区 Public SendPackSize(MaxPackSize) As UInt16 '每个数据包的尺寸 Public SendPackNum As UInt16 '当前已经制作的数据包序号 Public LinkMode As Byte = 0 '定义当前所使用的连接模式以及连接状态,0为无连接,1为UDP连接,2为TCP连接 Public AimPortNum As UInt16 '目的地端口号 Public MyPortNum As UInt16 '本机目前使用的端口号 Public AimIP As System.Net.IPAddress '目的IP地址 Public MyIP As System.Net.IPAddress '本机IP地址 Public UDPLink As New UdpClient(10000) '实例化一个UDP连接 Public NowDataSize As New Byte '当前数据的长度 '计算数据块校验和 Public Function GetCheckSum(ByVal packnum As UInt16) '校验和计算函数 Dim sum As UInt32 Dim i As UInt16 For i = 1 To SendPackSize(packnum) '循环计算该数据包内的每一个元素 sum = sum + SendPackBuf(packnum, i) '计算累加和 Next Return sum Mod 256 '返回计算出的校验和 End Function '启动连接 Public Sub StartLink() '过程:建立一个TCP或UDP连接 If LinkMode = 0 Then LinkMode = 1 Form2.LinkButton.Text = "关闭连接" UDPLink = New UdpClient UDPLink.Connect(AimIP.ToString, AimPortNum) '设置目的端口号和IP地址 ElseIf LinkMode = 1 Then Form2.LinkButton.Text = "启动连接" UDPLink.Close() LinkMode = 0 End If Debug.Print("已经运行到数据接收部分") Dim ipendpoint As New IPEndPoint(IPAddress.Any, 0) Dim receivebytes As [Byte]() = UDPLink.Receive(ipendpoint) Debug.Print("UDP数据接收完成") End Sub
目前已经定位到的问题是:程序执行到Dim receivebytes As [Byte]() = UDPLink.Receive(ipendpoint)这一句,直接卡死,而此时发送方还在不断发送数据。 展开
目前已经定位到的问题是:程序执行到Dim receivebytes As [Byte]() = UDPLink.Receive(ipendpoint)这一句,直接卡死,而此时发送方还在不断发送数据。 展开
展开全部
网上很多相关的现成的代码
你需要知道的一点是数据接收不是接收一次就完了 接收端根本不知道数据什么时候要过来 所以数据端应该一直重复着"等待-接收"的过程 于是就有了要在线程中接收数据的代码
你需要知道的一点是数据接收不是接收一次就完了 接收端根本不知道数据什么时候要过来 所以数据端应该一直重复着"等待-接收"的过程 于是就有了要在线程中接收数据的代码
更多追问追答
追问
我明白它收不到数据的时候确实应该卡死在那一行,但不知道为什么接收不到数据
其实是有多线程的,为了修正这个Bug暂时给删掉了
追答
'启动连接
Public Sub StartLink() '过程:建立一个TCP或UDP连接
If LinkMode = 0 Then
LinkMode = 1
Form2.LinkButton.Text = "关闭连接"
'UDPLink = New UdpClient
'UDPLink.Connect(AimIP.ToString, AimPortNum) '设置目的端口号和IP地址
ElseIf LinkMode = 1 Then
Form2.LinkButton.Text = "启动连接"
'UDPLink.Close()
LinkMode = 0
End If
Debug.Print("已经运行到数据接收部分")
Try
Dim ipendpoint As New IPEndPoint(IPAddress.Any, 0)
Dim receivebytes As [Byte]() = UDPLink.Receive(ipendpoint)
catch
Debug.Print(e.ToString())
End Try
Debug.Print("UDP数据接收完成")
End Sub
Receive 方法将阻止,直到数据报从远程主机到达为止。如果数据可用,则 Receive 方法将读取入队的第一个数据报,并将数据部分作为字节数组返回。此方法使用发送方的 IPAddress 和端口号来填充 remoteEP 参数。
如果在 Connect 方法中指定了默认远程主机,则 Receive 方法将只接受来自该主机的数据报。其他所有数据报将被丢弃。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询