公网服务器(windows server 2008),防火墙已全部关闭,
服务端(接收端)程序放在公网服务器上运行,等待接收UDP数据包,
内网客户端(发送端),防火墙已全部关闭, 程序向服务端发送UDP包,服务端死活都收不到数据包,
但把客户端(发送端)的程序也放在服务器上运行发送数据包,服务端是能收到数据包的,这说明程序代码应该是没问题的吧,
后来改为用TCP方式连接和收发数据包也都没问题,用UDP在内网发送就是不行,服务器收不到包,我也检查过内网的路由器,没有禁止与UDP通讯相关的功能,不知道是那里出问题,郁闷死了55555555555555555!
附上代码,请各位高手帮忙看下那里出问题了:
服务端(接收端):
Dim s As Socket = Nothing
Dim ServerIP As String = "223.192.190.51" '服务器外网IP地址(从网卡读取的IP地址)
Dim UDPClientPort As Integer = 8127
Dim bytes(2048) As Byte
Dim ReceiveLen As Integer = 0
Dim ReceiveData As String = ""
Dim LocalPoint As IPEndPoint = Nothing
Dim siep As New IPEndPoint(IPAddress.Parse(ServerIP), UDPClientPort)
Dim mRemoteEP As EndPoint = CType(siep, EndPoint)
Try
LocalPoint = New IPEndPoint(IPAddress.Parse(ServerIP), UDPClientPort)
s = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
s.Bind(LocalPoint)
ReceiveLen = s.ReceiveFrom(bytes, mRemoteEP) '接收数据
ReceiveData = Encoding.UTF8.GetString(bytes, 0, ReceiveLen)
Debug.Print(ReceiveData) '显示数据
Catch ex As Exception
MessageBox.Show(ex.Message, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
If Not IsNothing(s) Then
s.Close()
s = Nothing
End If
LocalPoint = Nothing
siep = Nothing
客户端(发送端):
Dim s As Socket = Nothing
Dim LocalPoint As IPEndPoint = Nothing
Dim strDataPacket As String = "美女美女,帅哥我来了!"
Dim sendBytes() As Byte = Encoding.UTF8.GetBytes(strDataPacket)
Dim sendByteCount As Integer = 0
Try
LocalPoint = New IPEndPoint(IPAddress.Parse("223.192.190.51"), 8127)
's = New Socket(LocalPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp)
s = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
sendByteCount = s.SendTo(sendBytes, 0, sendBytes.Length, SocketFlags.None, LocalPoint)
If sendByteCount > 0 Then
Debug.Print("已发送:" & sendByteCount.ToString & "字节")
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
If Not IsNothing(s) Then
s.Shutdown(SocketShutdown.Both)
s.Close()
s = Nothing
End If
LocalPoint = Nothing
------解决思路----------------------
使用 UdpClient 类编写 udp程序。使用TcpListener/TcpClient 类编写 Tcp 程序。
在.net中,这些专业的类库,都跟 Socket 机制不完全一样,Socket 是模仿Linux 通用的机制,而Udp和Tcp专用类型是针对 windows 进行了优化(例如自动使用 IOCP、NetworkStream 等等)。
我可以负责任地说,不建议程序员使用 Socket 类来编写tcp/udp程序。
------解决思路----------------------
从代码上来看应该没问题,是可以和服务器通讯的,但你必须确认服务器端或服务器所在的网络的UDP出入口是否被禁止了,因为有些网络提供商(托管)都会把UDP禁掉的!
------解决思路----------------------
Socket本身也支持IOCP的,最终模型都是一样的。