Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
PacketPeerUDP¶
继承: PacketPeer < RefCounted < Object
UDP 数据包客户端。
描述¶
UDP 数据包对等体。可用于发送原始 UDP 数据包,也可以发送 Variant。
注意:导出到安卓时,在导出项目、或使用一键部署之前,请务必在安卓导出预设中,开启 INTERNET
权限。否则,任何类型的网络通信,都将被 Android 阻止。
方法¶
bind ( int port, String bind_address="*", int recv_buf_size=65536 ) |
|
void |
close ( ) |
connect_to_host ( String host, int port ) |
|
get_local_port ( ) const |
|
get_packet_ip ( ) const |
|
get_packet_port ( ) const |
|
is_bound ( ) const |
|
is_socket_connected ( ) const |
|
join_multicast_group ( String multicast_address, String interface_name ) |
|
leave_multicast_group ( String multicast_address, String interface_name ) |
|
void |
set_broadcast_enabled ( bool enabled ) |
set_dest_address ( String host, int port ) |
|
wait ( ) |
方法说明¶
Error bind ( int port, String bind_address="*", int recv_buf_size=65536 )
将该 PacketPeerUDP 绑定到指定的 port
和 bind_address
,其缓冲区大小为 recv_buf_size
,允许它接收传入的数据包。
如果 bind_address
被设置为 "*"
(默认),对等体将被绑定到所有可用地址(IPv4 和 IPv6)。
如果 bind_address
被设置为 "0.0.0.0"
(对于 IPv4)或 "::"
(对于 IPv6),对等体将被绑定到匹配该 IP 类型的所有可用地址。
如果 bind_address
被设置为任何有效地址(例如 "192.168.1.101"
、"::1"
等),对等体将只被绑定到该地址的接口(如果不存在具有给定地址的接口,则失败)。
void close ( )
关闭该 PacketPeerUDP 底层 UDP 套接字。
Error connect_to_host ( String host, int port )
调用该方法将该 UDP 对等体连接到给定的 host
/port
对。UDP 实际上是无连接的,因此该选项仅意味着自动丢弃来自不同地址的传入数据包,并且传出的数据包始终发送到连接的地址(不允许将来调用 set_dest_address)。该方法不会向远程对等体发送任何数据,要发送数据,请像往常一样使用 PacketPeer.put_var 或 PacketPeer.put_packet。另请参阅 UDPServer。
注意:连接到远程对等体并不能防止 IP 欺骗等恶意攻击。如果你觉得你的应用程序正在传输敏感信息,可以考虑使用 TLS 或 DTLS 等加密技术。
int get_local_port ( ) const
返回该对等体绑定到的本地端口。
String get_packet_ip ( ) const
返回发送最后一个数据包(通过 PacketPeer.get_packet 或 PacketPeer.get_var 接收)的远程对等体的 IP。
int get_packet_port ( ) const
返回发送最后一个数据包(通过 PacketPeer.get_packet 或 PacketPeer.get_var 接收)的远程对等方的端口。
bool is_bound ( ) const
返回该 PacketPeerUDP 是否被绑定到某个地址上,并且可以接收数据包。
bool is_socket_connected ( ) const
如果 UDP 套接字已打开并已连接到远程地址,则返回 true
。见 connect_to_host。
Error join_multicast_group ( String multicast_address, String interface_name )
使用由 interface_name
标识的接口加入由 multicast_address
指定的多播组。
可以使用多个接口加入同一个多播组。使用 IP.get_local_interfaces 了解哪些接口可用。
注意:某些 Android 设备可能需要 CHANGE_WIFI_MULTICAST_STATE
权限才能进行多播。
Error leave_multicast_group ( String multicast_address, String interface_name )
从 multicast_address
指定的组播组中移除 interface_name
标识的接口。
void set_broadcast_enabled ( bool enabled )
启用或禁用广播数据包的发送(例如:set_dest_address("255.255.255.255", 4343)
。这个选项在默认情况下是禁用的。
注意:一些 Android 设备可能需要 CHANGE_WIFI_MULTICAST_STATE
权限和本选项被启用来接收广播包。
Error set_dest_address ( String host, int port )
设置发送数据包和变量的目标地址和端口。如果需要,将使用 DNS 解析主机名。
注意:在向广播地址(例如:255.255.255.255
)发送数据包之前,必须启用 set_broadcast_enabled。
Error wait ( )
等待数据包到达绑定的地址。见 bind。
注意:wait 一旦被调用就无法中断。解决方法是让对方发送一个特定的“毒药”数据包,如下所示:
socket = PacketPeerUDP.new()
# 服务端
socket.set_dest_address("127.0.0.1", 789)
socket.put_packet("Time to stop".to_ascii_buffer())
# 客户端
while socket.wait() == OK:
var data = socket.get_packet().get_string_from_ascii()
if data == "Time to stop":
return
var socket = new PacketPeerUDP();
// 服务端
socket.SetDestAddress("127.0.0.1", 789);
socket.PutPacket("Time to stop".ToAsciiBuffer());
// 客户端
while (socket.Wait() == OK)
{
string data = socket.GetPacket().GetStringFromASCII();
if (data == "Time to stop")
{
return;
}
}