当前位置: 代码迷 >> VB Dotnet >> 关于 Socket UDP 内外网连接通讯有关问题
  详细解决方案

关于 Socket UDP 内外网连接通讯有关问题

热度:418   发布时间:2016-04-25 02:10:57.0
关于 Socket UDP 内外网连接通讯问题
公网服务器(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禁掉的!
------解决思路----------------------
引用:
使用 UdpClient 类编写 udp程序。使用TcpListener/TcpClient 类编写 Tcp 程序。

在.net中,这些专业的类库,都跟 Socket  机制不完全一样,Socket 是模仿Linux 通用的机制,而Udp和Tcp专用类型是针对 windows 进行了优化(例如自动使用 IOCP、NetworkStream 等等)。

我可以负责任地说,不建议程序员使用 Socket 类来编写tcp/udp程序。


Socket本身也支持IOCP的,最终模型都是一样的。
  相关解决方案