#include #include #include #include #include #include struct net_socket_domain { ENetHost *host; ENetPeer *peers; void (*on_connected)(void *arg); void (*on_disconnected)(void *arg); void *arg; }; enum { CHANNEL, MAX_CHANNELS }; struct net_socket_domain *net_connect_ipv4(const union net_connect *const c) { struct net_socket_domain *const s = calloc(1, sizeof *s); if (!s) goto failure; s->on_connected = c->common.on_connected; s->on_disconnected = c->common.on_disconnected; s->arg = c->common.arg; s->host = enet_host_create(NULL, 1, MAX_CHANNELS, 0, 0); if (!s->host) { fprintf(stderr, "%s: enet_host_create failed\n", __func__); goto failure; } ENetAddress addr; if (enet_address_set_host(&addr, c->ipv4.addr)) { fprintf(stderr, "%s: enet_address_set_host failed\n", __func__); goto failure; } addr.port = c->ipv4.port; if (!(s->peers = enet_host_connect(s->host, &addr, MAX_CHANNELS, 0))) { fprintf(stderr, "%s: enet_host_connect failed\n", __func__); goto failure; } return s; failure: if (s && s->host) enet_host_destroy(s->host); free(s); return NULL; } int net_read_ipv4(struct net_socket_domain *const s, void *const buf, const size_t n) { return -1; } int net_write_ipv4(struct net_socket_domain *const s, const void *const buf, const size_t n) { return -1; } int net_close_ipv4(struct net_socket_domain *const s) { if (s && s->host) enet_host_destroy(s->host); free(s); return 0; } int net_update_ipv4(struct net_socket_domain *const s) { int res; ENetEvent ev; while ((res = enet_host_service(s->host, &ev, 0)) > 0) { switch (ev.type) { case ENET_EVENT_TYPE_CONNECT: if (s->on_connected) s->on_connected(s->arg); break; case ENET_EVENT_TYPE_DISCONNECT: if (s->on_disconnected) s->on_disconnected(s->arg); case ENET_EVENT_TYPE_RECEIVE: break; case ENET_EVENT_TYPE_NONE: break; } } if (res < 0) { fprintf(stderr, "%s: enet_host_service failed\n", __func__); return res; } return 0; } struct net_socket_domain *net_server_ipv4(const union net_server *const srv) { struct net_socket_domain *const s = calloc(1, sizeof *s); if (!s) goto failure; const ENetAddress addr = { .port = srv->ipv4.port }; s->host = enet_host_create(&addr, srv->common.max_players, MAX_CHANNELS, 0, 0); if (!s->host) { fprintf(stderr, "%s: enet_host_create failed\n", __func__); goto failure; } return s; failure: free(s); return NULL; } int net_init_ipv4(void) { return enet_initialize(); } void net_deinit_ipv4(void) { enet_deinitialize(); }