проблем с получаването и излъчването на udpclient

Имам този код, който продължава да ми създава два проблема.

първи

Заявеният адрес не е валиден в своя контекст

второ, получава излъчване, което изпраща, не искам това. Искам само приложението за сървър за слушане да получава излъчването

кода за изпращане

Dim sendMessage As New structMessage
        sendMessage.Command = Command.IP
        Dim byteData As Byte() = sendMessage.ToByte()
        'Using UDP sockets

        epServer = New IPEndPoint(IPAddress.Any, iCurrUDPPort)

        'sckClientUDP.EnableBroadcast = True
        sckClientUDP.EnableBroadcast = True
        sckClientUDP.BeginSend(byteData, byteData.Length, _
                               CType(epServer, Net.IPEndPoint), _
                                New AsyncCallback(AddressOf sckClientUDP_DataArrival), _
                                Nothing)


        '## if server not found , increment port
        If iCurrUDPPort = iToPort Then
            iCurrUDPPort = iFromPort
        Else
            iCurrUDPPort = iCurrUDPPort + 1
        End If

Получаващият код

    Private Sub sckClientUDP_DataArrival(ByVal ar As IAsyncResult)
        Try
            Dim remoteEP As EndPoint = Nothing
            sckClientUDP.EndReceive(ar, CType(remoteEP, IPEndPoint))
            'Convert the bytes received into an object of type Data
            Dim recvMessage As New structMessage(byteData)
            'Accordingly process the message received
            Select Case recvMessage.Command
                Case Command.IP
                    ServerIP = recvMessage.IP
                    ServerPort = recvMessage.Port
                    ' try connect here (TCP)
            End Select

            byteData = New Byte(1023) {}

            'Start listening to receive more data from the user
            sckClientUDP.BeginReceive(New AsyncCallback(AddressOf sckClientUDP_DataArrival), Nothing)
        Catch generatedExceptionName As ObjectDisposedException
        Catch ex As Exception
            Debug.Print(ex.Message)
        End Try
end sub

Как да поправя този проблем?


person Smith    schedule 23.08.2011    source източник


Отговори (1)


Първо, трябва да излъчвате към действителен IP адрес на подмрежа, а не към IPAddress.Any.

Второ, не можете да избегнете дублирания пакет. Предполага се, че излъчващият сокет получава същия пакет, който излъчва. Това е част от начина, по който работи излъчването. Ще трябва да филтрирате всички нежелани пакети, като сравните IP адреса на подателя им с вашия излъчващ IP адрес, за да видите дали съвпадат.

person Remy Lebeau    schedule 24.08.2011
comment
благодаря, но как да открия в кода подмрежата, в която е моята програма? - person Smith; 25.08.2011
comment
Можете да използвате IPAddress.Broadcast вместо IPAddress.Any за излъчване към всяка подмрежа, към която сте свързани. Ако искате да излъчвате само към определени подмрежи, тогава трябва да знаете какви са присвоените ви IP адрес и подмрежова маска във всяка мрежа, след което можете да форматирате подходящи IP адреси за излъчване, като маскирате IP адреса с неговата подмрежова маска. Тази статия ви показва как да намерите IP адресите и подмрежовите маски в .NET 2.0+: blogs.msdn.com/b/dgorti/archive/2005/10/04/477078.aspx - person Remy Lebeau; 26.08.2011