void sv_net_get_client_input(void) { netconnection_t *nc; client_t *cl, *next; int rfd; sv_net_update(); for( cl = cl_root ; cl != NULL ; cl = next ) { nc = cl->nc; next = cl->next; if( nc->incoming ) { if( (rfd = net_input_flush( cl->nc, NM_ALL )) > 0 ) { sv_net_handle_client( cl ); nc->incoming = 0; } else if( rfd == 0 ) { if( ++cl->bad >= MAX_BAD ) { sv_netmsg_send_rejection(cl->nc, "Too many read errors"); sv_net_remove_client(cl); continue; } else printf("Read error %d for %s\n", cl->bad, cl->name); } else { printf("Input error from \"%s\" (%s).\n", cl->name, cl->nc->remote_address); sv_net_remove_client(cl); continue; } } if( cl->status == ACTIVE ) sv_net_update_clients_entity( cl ); } }
int cl_net_update(void) { int status; nm_frame_t nm; netmsg msg; if( client.debug ) { printf("**************************\n"); printf("cl_net_update(): About to get read() from server.....\n"); } if( client.demo == DEMO_PLAY ) nm = NM_FIRST_FRAME; else nm = NM_LAST_FRAME; status = net_input_flush( server, nm ); if( status < 0 ) { /* Check for errors */ if( client.demo == DEMO_PLAY ) { /* END of the demo. */ cl_network_disconnect(); client.state = MENU; } else { printf("cl_net_update(): net_input_flush() returned %d\n", status); cl_net_connection_lost(NULL); } return status; } else if( status == 0 ) { printf("Skipping this loop, but trying again\n"); return status; } while( (msg = net_next_message(server,NM_LAST_FRAME)).type != NETMSG_NONE ) cl_net_handle_message(msg); return status; }
int cl_network_connect(char *sv_name, int port) { struct hostent *hp; struct sockaddr_in addr; netmsg msg; demo_header header; int sock = -1; if( client.demo != DEMO_PLAY ) { /* A real connection, not just a demo */ memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); if(!client.with_ggz) { sock = net_init_socket(); if( (addr.sin_addr.s_addr = inet_addr(sv_name)) == INADDR_NONE ) { if((hp = gethostbyname(sv_name)) == NULL) { close(sock); sock = -1; return 0; } else { addr.sin_addr.s_addr = *(long *) hp->h_addr; } } if( connect(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0 ) { perror("connect"); close(sock); sock = -1; return 0; } } else { /* ggz mode */ signal(SIGPIPE, SIG_IGN); /* Ignore Pipe errors */ if( (sock = ggz_client_get_sock()) < 0 ) { sock = -1; return 0; } /* avoid perdig effect */ sleep(3); } } switch( client.demo ) { case DEMO_RECORD: printf("RECORDING Connection.......\n"); header.x_tiles = client.x_tiles; header.y_tiles = client.y_tiles; header.fps = client.fps; server = net_rec_new_connection(sock, client.demoname, header); break; case DEMO_PLAY: server = net_fake_connection(client.demoname, &header); client.x_tiles = header.x_tiles; client.y_tiles = header.y_tiles; client.view_w = client.x_tiles * TILE_W; client.view_h = client.y_tiles * TILE_H; break; case DEMO_NONE: default: server = net_new_connection(sock); } if( server == NULL ) { printf("Couldn't create new connection\n"); close(sock); sock = -1; return 0; } client.connected = 1; client.sv_status = JOINING; printf("Joining Game....\n"); cl_netmsg_send_join(); printf("Querying Server info......\n"); cl_netmsg_send_query_sv_info(); net_output_flush(server); /* FIXME: This alarm() does not work correctly */ alarm(10); /* Timeout after 10 secs */ signal(SIGALRM, sigcatcher); printf("Reading data from server...... "); while( net_input_flush(server, NM_ALL) > 0 ) { printf("Got something!\n"); while( (msg = net_next_message(server, NM_ALL)).type != NETMSG_NONE ) { if( msg.type == NETMSG_SV_INFO ) { /* Got server info ok, we can join the game */ alarm(0); cl_net_handle_message(msg); return 1; } else if(msg.type == NETMSG_REJECTION || msg.type == NETMSG_QUIT){ /* We were rejected or another error occured trying to join */ alarm(0); cl_net_handle_message(msg); return 0; } else if( client.debug ) { printf("IGNORING message type %d!\n", msg.type); } } } alarm(0); printf("TIMED OUT waiting for server info!\n"); cl_network_disconnect(); return 0; }