dart:io、Flutter、UDP Socket (RawDatagramSocket) socket.listen 不接收包,而 powershell 客户端接收包时

Ang*_*-Br 5 sockets powershell networking dart flutter

语境

我希望能够让 2 个 flutter 客户端使用 Dart:io 中的 RawDatagramSocket 通过 UDP 套接字相互发送数据。两个客户端都知道对方的 IP 地址以及他们正在侦听和接收的端口

目前的问题:

当将 UDP 数据包发送到与发送者位于同一 LAN 上的 flutter 客户端时,socket.listen() 方法不会接收 UDP 数据包。

当从 powershell 窗口或 flutter 客户端发送 UDP 数据包到 UDP powershell 侦听器时,数据包确实会被接收并可以读取。


问题:当共享相同的 IP 地址和侦听端口时,powershell 客户端如何接收数据包,但 flutter 客户端却收不到数据包?

颤振客户端

当向在端口 1338 上侦听的客户端发送数据包时,侦听不会打印任何指示它未收到数据包的内容。

class ChatCubit extends Cubit<ChatState> {
  ChatCubit() : super(ChatLoading());

  String addressValue = 'IP OF THE TARGET MACHINE';

  late RawDatagramSocket udpSocket;

  Future main() async {
    udpSocket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 1338);
    udpSocket.broadcastEnabled = true;

    print('############# Listening to Messages #############');

    udpSocket.listen((event) {
      print("recv e: $event");
      if (event == RawSocketEvent.read) {
        print(utf8.decode(udpSocket.receive()!.data));
      }
    }, onError: (error) {
      print("error: $error");
    }, onDone: () {
      print("done!");
    }, cancelOnError: true);

    print('${udpSocket.address.address}:${udpSocket.port}');
  }

  void sendMessage(String basicMessage) async {
    print('############# Sending Message #############');

    udpSocket.send(const Utf8Codec().encode(basicMessage), InternetAddress(addressValue), 1337);
  }
}
Run Code Online (Sandbox Code Playgroud)

发送者powershell

使用此powershell脚本向flutter客户端发送UDP数据包会导致客户端收不到任何东西

function Send-UdpDatagram
{
      Param ([string] $EndPoint, 
      [int] $Port, 
      [string] $Message)

      $IP = [System.Net.Dns]::GetHostAddresses($EndPoint) 
      $Address = [System.Net.IPAddress]::Parse($IP) 
      $EndPoints = New-Object System.Net.IPEndPoint($Address, $Port) 
      $Socket = New-Object System.Net.Sockets.UDPClient 
      $EncodedText = [Text.Encoding]::ASCII.GetBytes($Message) 
      $SendMessage = $Socket.Send($EncodedText, $EncodedText.Length, $EndPoints) 
      $Socket.Close() 
} 

Run Code Online (Sandbox Code Playgroud)

powershell命令:Send-UdpDatagram -EndPoint“目标机器的IP”-端口1338-消息“test.mymetric:0 | c”

接收器电源壳

使用此 powershell 脚本侦听将到达端口 1338 的 UDP 数据包,它使用使用相同代码但使用 sendMessage 到端口 1338 并侦听 1337 的不同 flutter 客户端成功接收数据包。或者发送者 powershell 脚本。

param( $address="Any", $port=1338)


try{
    $endpoint = new-object System.Net.IPEndPoint( [IPAddress]::$address, $port )
    $udpclient = new-object System.Net.Sockets.UdpClient $port
}
catch{
    throw $_
    exit -1
}

Write-Host "Press ESC to stop the udp server ..." -fore yellow
Write-Host ""
while( $true )
{
    if( $host.ui.RawUi.KeyAvailable )
    {
        $key = $host.ui.RawUI.ReadKey( "NoEcho,IncludeKeyUp,IncludeKeyDown" )
        if( $key.VirtualKeyCode -eq 27 )
        {    break    }
    }

    if( $udpclient.Available )
    {
        $content = $udpclient.Receive( [ref]$endpoint )
        Write-Host "$($endpoint.Address.IPAddressToString):$($endpoint.Port) $([Text.Encoding]::ASCII.GetString($content))"
    }
}

$udpclient.Close( )
Run Code Online (Sandbox Code Playgroud)

大问题

从 flutter 客户端或 powershell 窗口发送到 powershell 窗口监听器如何工作?但是向 flutter 客户端发送 UDP 数据包并尝试监听它,它只是不想接收它。