#include #include #include #include #include "enet/enet.h" static const int TIMEOUT = 5; static const char SV_CONNECT = 0; static const char *USERNAME = "Felix"; static const char *PASSWORD = ""; static const char PLAYERMODEL = 0; void die(const char *why) { write(2, why, strlen(why)); enet_deinitialize(); _exit(-1); } int main(int argc, char **argv) { char *host, *port_str, *login_buf; time_t start; int state, timeout, login_buf_size; ENetAddress address; ENetHost *client; ENetPeer *peer; ENetPacket *login_packet; ENetEvent event; if (argc != 3) die("usage: bandnudel_check \n"); host = argv[1]; port_str = argv[2]; if (enet_initialize() != 0) die("cannot initialize enet\n"); client = enet_host_create(NULL, 2, 100*1000*1000/8, 100*1000*1000/8); if (!client) die("cannot create client\n"); enet_address_set_host(&address, host); address.port = (enet_uint16) atoi(port_str); peer = enet_host_connect(client, &address, 3); enet_host_flush(client); if (!peer) die("cannot connect to server\n"); login_buf = alloca(sizeof(SV_CONNECT) + strlen(USERNAME) + 1 + strlen(PASSWORD) + 1 + sizeof(PLAYERMODEL)); login_buf_size = 0; memcpy(login_buf + login_buf_size, &SV_CONNECT, sizeof(SV_CONNECT)); login_buf_size += sizeof(SV_CONNECT); memcpy(login_buf + login_buf_size, USERNAME, strlen(USERNAME) + 1); login_buf_size += strlen(USERNAME) + 1; memcpy(login_buf + login_buf_size, PASSWORD, strlen(PASSWORD) + 1); login_buf_size += strlen(PASSWORD) + 1; memcpy(login_buf + login_buf_size, &PLAYERMODEL, sizeof(PLAYERMODEL)); login_buf_size += sizeof(PLAYERMODEL); login_packet = enet_packet_create(login_buf, login_buf_size, ENET_PACKET_FLAG_RELIABLE); start = time(NULL); state = 2; while (state > 0) { timeout = TIMEOUT - time(NULL) + start; if (enet_host_service(client, &event, timeout * 1000) <= 0) break; switch (event.type) { case ENET_EVENT_TYPE_RECEIVE: enet_packet_destroy(event.packet); state = 0; break; case ENET_EVENT_TYPE_CONNECT: enet_peer_send(peer, 1, login_packet); enet_host_flush(client); state = 1; break; case ENET_EVENT_TYPE_DISCONNECT: state = -1; break; case ENET_EVENT_TYPE_NONE: break; } } enet_peer_reset(peer); enet_host_destroy(client); enet_deinitialize(); return state; }