C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.相关的知识,希望对你有一定的参考价值。

我现在要连接到我朋友的服务器 如: xxx.xxx.com:8080

我用Socket.BeginConnect()的方法连接并用.BeginSend()向其发送了命令字符串 没有出错 但是运行到.BeginReceive()时 始终不见其运行AsyncCallback调用的方法(ReceiveCallback)

导致无法获取其返回信息 这会是什么原因呢??

朋友说他说应该是没发送成功,因为他的服务器只要向那发送了信息就有返回的如:错误命令 所以我觉得应该是我的连接和发送都已经存在问题的 但是我的代码是微软Tcp的例子稍改成Udp的 可能那里出错了 谁能给指点下 Udp到底要怎么使用吗?

给个流程...或者简单的示例也好啊,,满意 可追加~~~

服务器先进行
Bind ()绑定服务器的端口
然后BeginReceive接受客户端发送的数据

客户端Bind ()绑定客户端接受和发送数据的端口
SendTo()来发送数据就可以

不需要进行BeginConnect,因为UDP不需要连接
参考技术A 可能 中间有防火墙 路由包过滤等防护措施

vb.net 第六节 获取当前UDP连接情况 GetUdpTable

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

Imports System.Runtime.InteropServices

Public Class Form7

    'typedef struct _MIB_UDPTABLE 
    '  DWORD dwNumEntries; 
    '  MIB_UDPROW table[ANY_SIZE]; 
    ' MIB_UDPTABLE, *PMIB_UDPTABLE;

    'typedef struct _MIB_UDPROW 
    '  DWORD dwLocalAddr; 
    '  DWORD dwLocalPort; 
    ' MIB_UDPROW, *PMIB_UDPROW;



    'Type MIB_UDPTABLE
    '    dwNum_Of_Entries As Long       		'当前 UDP连接的总数
    '    UDP_Table() As MIB_UDPROW   		'指向包含MIB_UDPROW类型的指针
    'End Type

    'Type MIB_UDPROW
    '    dwLocalAddr As Long         '本地IP
    '    dwLocalPort As Long         '本地端口
    'End Type

    'Private Declare Function GetUdpTable Lib "iphlpapi.dll" (ByRef pTcpTable As MIB_UDPTABLE, ByRef pdwSize As Long, ByVal bOrder As Long) As Long

    Structure MIB_UDPTABLE
        Dim dwNum_Of_Entries As Integer            '当前 UDP连接的总数
        Dim UDP_Table() As MIB_UDPROW        '指向包含MIB_UDPROW类型的指针
    End Structure

    Structure MIB_UDPROW
        Dim dwLocalAddr As Integer         '本地IP
        Dim dwLocalPort As Integer         '本地端口
    End Structure

    Private Declare Function GetUdpTable Lib "iphlpapi.dll" (ByRef pUdpTable As IntPtr, ByRef pdwSize As Integer, ByVal bOrder As Integer) As Integer
    Private Declare Function GetUdpTable Lib "iphlpapi.dll" (ByVal pUdpTable() As Byte, ByRef pdwSize As Integer, ByVal bOrder As Integer) As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pMIB_UDPTABLE As IntPtr = IntPtr.Zero
        Dim dwSize As Integer

        Dim returnValue As Integer
        '第一次调用,返回122:ERROR_INSUFFICIENT_BUFFER,缓冲区大小不足
        'pdwSize参数返回实际需要的字节大小
        returnValue = GetUdpTable(pMIB_UDPTABLE, dwSize, True)

        Dim bufferMIB_UDPTABLE(dwSize - 1) As Byte

        '第二次调用获得数据
        returnValue = GetUdpTable(bufferMIB_UDPTABLE, dwSize, True)

        '获得数量
        Dim bytesNumEntries(3) As Byte
        Array.Copy(bufferMIB_UDPTABLE, 0, bytesNumEntries, 0, 4)
        Dim size As Integer = Marshal.SizeOf(bytesNumEntries(0)) * bytesNumEntries.Length
        Dim ptrNumEntries As IntPtr = Marshal.AllocHGlobal(size)
        Marshal.Copy(bytesNumEntries, 0, ptrNumEntries, 4)
        Dim NumEntries As Integer
        NumEntries = Marshal.ReadInt32(ptrNumEntries)

        Dim MIBUr As MIB_UDPROW
        Dim sizeMIBTr As Integer = Marshal.SizeOf(MIBUr)

        For i As Integer = 0 To NumEntries - 1
            Dim pMIB_TCPROW As New IntPtr
            pMIB_TCPROW = Marshal.AllocHGlobal(sizeMIBTr)
            Marshal.Copy(bufferMIB_UDPTABLE, 4 + sizeMIBTr * i, pMIB_TCPROW, sizeMIBTr)
            MIBUr = Marshal.PtrToStructure(pMIB_TCPROW, GetType(MIB_UDPROW))

            TextBox1.Text &= IntToIP(MIBUr.dwLocalAddr) & ":" & MIBUr.dwLocalPort & vbCrLf
        Next
    End Sub

    'Integer型IP转字符串
    Private Function IntToIP(ByVal intAddr As Integer) As String
        Dim bteIp() As Byte
        bteIp = BitConverter.GetBytes(intAddr)
        Dim ip As String = ""
        For i As Integer = 0 To bteIp.Length - 1
            ip &= bteIp(i).ToString & "."
        Next

        Return ip.Substring(0, ip.Length - 1)
    End Function

End Class

 

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供的参考。

学习更多vb.net知识,请参看 vb.net 教程 目录

以上是关于C#/VB.NET中 UDP协议连接服务器问题...运行没出错..但是收不到信息.的主要内容,如果未能解决你的问题,请参考以下文章

网络通信时选择基于TCP/IP协议 还是 UDP/IP协议?

QQ是一个基于TCP/UDP协议的通讯软件

vb.net 第六节 获取当前UDP连接情况 GetUdpTable

如何使用 TLS/SSL 确保套接字连接的安全

[VB.NET]Upnp/udp打孔聊天程序tcp/udp sockets

TCP协议详解--三握四挥