Use NetSocket directly for ENet.

Avoid PacketPeerUDP buffering.
This commit is contained in:
Fabio Alessandrelli 2018-10-18 22:35:11 +02:00
parent 64f649a80c
commit c5a4d638c6

View file

@ -33,7 +33,7 @@
*/
#include "core/io/ip.h"
#include "core/io/packet_peer_udp.h"
#include "core/io/net_socket.h"
#include "core/os/os.h"
// This must be last for windows to compile (tested with MinGW)
@ -90,6 +90,16 @@ int enet_address_get_host(const ENetAddress *address, char *name, size_t nameLen
return -1;
}
ENetSocket enet_socket_create(ENetSocketType type) {
NetSocket *socket = NetSocket::create();
IP::Type ip_type = IP::TYPE_ANY;
socket->open(NetSocket::TYPE_UDP, ip_type);
socket->set_blocking_enabled(false);
return socket;
}
int enet_socket_bind(ENetSocket socket, const ENetAddress *address) {
IP_Address ip;
@ -99,23 +109,15 @@ int enet_socket_bind(ENetSocket socket, const ENetAddress *address) {
ip.set_ipv6(address->host);
}
PacketPeerUDP *sock = (PacketPeerUDP *)socket;
if (sock->listen(address->port, ip) != OK) {
NetSocket *sock = (NetSocket *)socket;
if (sock->bind(ip, address->port) != OK) {
return -1;
}
return 0;
}
ENetSocket enet_socket_create(ENetSocketType type) {
PacketPeerUDP *socket = memnew(PacketPeerUDP);
socket->set_blocking_mode(false);
return socket;
}
void enet_socket_destroy(ENetSocket socket) {
PacketPeerUDP *sock = (PacketPeerUDP *)socket;
NetSocket *sock = (NetSocket *)socket;
sock->close();
memdelete(sock);
}
@ -124,13 +126,12 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
ERR_FAIL_COND_V(address == NULL, -1);
PacketPeerUDP *sock = (PacketPeerUDP *)socket;
NetSocket *sock = (NetSocket *)socket;
IP_Address dest;
Error err;
size_t i = 0;
dest.set_ipv6(address->host);
sock->set_dest_address(dest, address->port);
// Create a single packet.
PoolVector<uint8_t> out;
@ -148,7 +149,8 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
pos += buffers[i].dataLength;
}
err = sock->put_packet((const uint8_t *)&w[0], size);
int sent = 0;
err = sock->sendto((const uint8_t *)&w[0], size, sent, dest, address->port);
if (err != OK) {
if (err == ERR_BUSY) { // Blocking call
@ -159,32 +161,36 @@ int enet_socket_send(ENetSocket socket, const ENetAddress *address, const ENetBu
return -1;
}
return size;
return sent;
}
int enet_socket_receive(ENetSocket socket, ENetAddress *address, ENetBuffer *buffers, size_t bufferCount) {
ERR_FAIL_COND_V(bufferCount != 1, -1);
PacketPeerUDP *sock = (PacketPeerUDP *)socket;
NetSocket *sock = (NetSocket *)socket;
int pc = sock->get_available_packet_count();
if (pc < 1) {
return pc;
}
Error ret = sock->poll(NetSocket::POLL_TYPE_IN, 0);
const uint8_t *buffer;
int buffer_size;
Error err = sock->get_packet(&buffer, buffer_size);
if (err)
if (ret == ERR_BUSY)
return 0;
if (ret != OK)
return -1;
copymem(buffers[0].data, buffer, buffer_size);
int read;
IP_Address ip;
enet_address_set_ip(address, sock->get_packet_address().get_ipv6(), 16);
address->port = sock->get_packet_port();
Error err = sock->recvfrom((uint8_t *)buffers[0].data, buffers[0].dataLength, read, ip, address->port);
if (err == ERR_BUSY)
return 0;
return buffer_size;
if (err != OK)
return -1;
enet_address_set_ip(address, ip.get_ipv6(), 16);
return read;
}
// Not implemented