|
@@ -383,49 +383,49 @@ static ClientState *AllocClient(SOCKET s
|
|
|
NetworkClientInfo *ci;
|
|
|
byte client_no;
|
|
|
|
|
|
client_no = 0;
|
|
|
|
|
|
if (_network_server) {
|
|
|
// Can we handle a new client?
|
|
|
if (_network_clients_connected >= MAX_CLIENTS)
|
|
|
return NULL;
|
|
|
|
|
|
if (_network_game_info.clients_on >= _network_game_info.clients_max)
|
|
|
return NULL;
|
|
|
|
|
|
// Register the login
|
|
|
client_no = _network_clients_connected++;
|
|
|
}
|
|
|
|
|
|
cs = &_clients[client_no];
|
|
|
memset(cs, 0, sizeof(*cs));
|
|
|
cs->socket = s;
|
|
|
cs->last_frame = 0;
|
|
|
cs->quited = false;
|
|
|
|
|
|
if (_network_server) {
|
|
|
ci = &_network_client_info[client_no];
|
|
|
ci = DEREF_CLIENT_INFO(cs);
|
|
|
memset(ci, 0, sizeof(*ci));
|
|
|
|
|
|
cs->index = _network_client_index++;
|
|
|
ci->client_index = cs->index;
|
|
|
ci->join_date = _date;
|
|
|
|
|
|
InvalidateWindow(WC_CLIENT_LIST, 0);
|
|
|
}
|
|
|
|
|
|
return cs;
|
|
|
}
|
|
|
|
|
|
// Close a connection
|
|
|
void CloseClient(ClientState *cs)
|
|
|
{
|
|
|
NetworkClientInfo *ci;
|
|
|
// Socket is already dead
|
|
|
if (cs->socket == INVALID_SOCKET) return;
|
|
|
|
|
|
DEBUG(net, 1) ("[NET] Closed client connection");
|
|
|
|
|
|
if (!cs->quited && _network_server && cs->status > STATUS_INACTIVE) {
|
|
|
// We did not receive a leave message from this client...
|
|
|
NetworkErrorCode errorno = NETWORK_ERROR_CONNECTION_LOST;
|
|
@@ -679,48 +679,49 @@ void NetworkClose(void)
|
|
|
if (!_network_server) {
|
|
|
SEND_COMMAND(PACKET_CLIENT_QUIT)("leaving");
|
|
|
NetworkSend_Packets(cs);
|
|
|
}
|
|
|
CloseClient(cs);
|
|
|
}
|
|
|
|
|
|
if (_network_server) {
|
|
|
// We are a server, also close the listensocket
|
|
|
closesocket(_listensocket);
|
|
|
_listensocket = INVALID_SOCKET;
|
|
|
DEBUG(net, 1) ("[NET] Closed listener");
|
|
|
NetworkUDPClose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Inits the network (cleans sockets and stuff)
|
|
|
void NetworkInitialize(void)
|
|
|
{
|
|
|
ClientState *cs;
|
|
|
|
|
|
_local_command_queue = NULL;
|
|
|
|
|
|
// Clean all client-sockets
|
|
|
memset(_clients, 0, sizeof(_clients));
|
|
|
for (cs = _clients; cs != &_clients[MAX_CLIENTS]; cs++) {
|
|
|
cs->socket = INVALID_SOCKET;
|
|
|
cs->status = STATUS_INACTIVE;
|
|
|
cs->command_queue = NULL;
|
|
|
}
|
|
|
|
|
|
// Clean the client_info memory
|
|
|
memset(_network_client_info, 0, sizeof(_network_client_info));
|
|
|
memset(_network_player_info, 0, sizeof(_network_player_info));
|
|
|
|
|
|
_sync_frame = 0;
|
|
|
_network_first_time = true;
|
|
|
|
|
|
_network_reconnect = 0;
|
|
|
|
|
|
InitPlayerRandoms();
|
|
|
|
|
|
NetworkUDPInitialize();
|
|
|
}
|
|
|
|
|
|
// Query a server to fetch his game-info
|
|
|
// If game_info is true, only the gameinfo is fetched,
|
|
|
// else only the client_info is fetched
|
|
|
void NetworkQueryServer(const byte* host, unsigned short port, bool game_info)
|