0

同じコンピューター上で一緒に動作する非常に単純なUDPクライアント/サーバーペアを作成しようとしていますが(今のところ)、パケットが配信されていません。以下のコードは、100%完全なVB.NETコンソールアプリケーションです。エラーをスローせずに実行されますが、mListener.Receiveコマンドが戻ることはありません。

質問1:パケットを受信しないのはなぜですか?

質問2:クライアントにIPAddress.Anyをエンドポイントとして使用させることができないのはなぜですか?New IPEndPoint(IPAddress.Any、10123)に接続しようとすると、「要求されたアドレスはそのコンテキスト0.0.0.0:10123では無効です」という例外が発生します。

Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Module Module1
    Sub Main()
        Dim ep As New IPEndPoint(IPAddress.Loopback, 10123)
        Dim s As New Server(ep)
        Dim c As New Client(ep)
        Do
            Console.WriteLine("Waiting in main loop...")
            Thread.Sleep(5000)
        Loop
    End Sub
End Module

Public Class Server
    Private mBroadcaster As UdpClient

    Public Sub New(ep As IPEndPoint)
        mBroadcaster = New UdpClient
        mBroadcaster.ExclusiveAddressUse = False
        mBroadcaster.Connect(ep)
        Dim sender As New Thread(AddressOf SendLoop)
        sender.Start()
    End Sub

    Private Sub SendLoop()
        Do
            Dim msg As Byte() = Text.ASCIIEncoding.ASCII.GetBytes("Hello world")
            Console.WriteLine("Sending...")
            mBroadcaster.Send(msg, msg.Length)
            Thread.Sleep(1000)
        Loop
    End Sub
End Class

Public Class Client
    Private mListener As UdpClient

    Public Sub New(ep As IPEndPoint)
        mListener = New UdpClient
        mListener.ExclusiveAddressUse = False
        mListener.Connect(ep) 'Why can't I use IPAddress.Any here?
        Dim poller As New Thread(AddressOf PollLoop)
        poller.Start()
    End Sub

    Private Sub PollLoop()
        Do
            Dim ep As IPEndPoint = Nothing
            Console.WriteLine("  Receiver listening...")
            Dim incomingbytes As Byte() = mListener.Receive(ep)
            Dim msg As String = Text.ASCIIEncoding.ASCII.GetString(incomingbytes)
            Console.WriteLine("  Received: " & msg & " from " & ep.Address.ToString & ":" & ep.Port)
        Loop
    End Sub
End Class
4

1 に答える 1

0

元のコードが機能しない理由はまだわかりませんが、元のコードが意図していることを達成する方法を見つけました。基本的な考え方は、サーバーに UdpClient を使用することは明らかに問題ありませんが、クライアントに UdpClient を使用することは適切ではありません。代わりに、UdpClient を下位レベルの Socket に変更しました。サーバーの UdpClient を Socket に置き換えても問題ないと思いますが、テストしていません。これにより、質問 2 も解決されます (未加工の Socket では、IPAddress.Any をリッスンできます)。

これが事実である理由を実際に説明する別の答えをまだ受け入れます。

Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Module Module1
    Sub Main()
        Dim s As New Server
        Dim c As New Client
        Do
            Console.WriteLine("Waiting in main loop...")
            Thread.Sleep(5000)
        Loop
    End Sub
End Module

Public Class Server
    Private mBroadcaster As UdpClient

    Public Sub New()
        mBroadcaster = New UdpClient
        mBroadcaster.ExclusiveAddressUse = False
        mBroadcaster.Connect(New IPEndPoint(IPAddress.Broadcast, 10123))
        Dim sender As New Thread(AddressOf SendLoop)
        sender.Start()
    End Sub

    Private Sub SendLoop()
        Do
            Dim msg As Byte() = Text.ASCIIEncoding.ASCII.GetBytes("Hello world")
            Console.WriteLine("Sending...")
            mBroadcaster.Send(msg, msg.Length)
            Thread.Sleep(1000)
        Loop
    End Sub
End Class

Public Class Client
    Private mListener As Socket

    Public Sub New()
        mListener = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        mListener.ExclusiveAddressUse = False
        mListener.Bind(New IPEndPoint(IPAddress.Any, 10123))
        Dim poller As New Thread(AddressOf PollLoop)
        poller.Start()
    End Sub

    Private Sub PollLoop()
        Dim buffer As Byte() = New Byte(1023) {}
        Do
            Console.WriteLine("  Receiver listening...")
            Dim nbytes As Integer = mListener.Receive(buffer)
            Dim msg As String = Text.ASCIIEncoding.ASCII.GetString(buffer, 0, nbytes)
            Console.WriteLine("  Received: " & msg)
        Loop
    End Sub
End Class
于 2013-03-21T20:34:31.397 に答える