diff options
Diffstat (limited to 'Source/Network/asnetwork.cpp')
-rw-r--r-- | Source/Network/asnetwork.cpp | 176 |
1 files changed, 85 insertions, 91 deletions
diff --git a/Source/Network/asnetwork.cpp b/Source/Network/asnetwork.cpp index 55a45273..a04e250f 100644 --- a/Source/Network/asnetwork.cpp +++ b/Source/Network/asnetwork.cpp @@ -40,103 +40,97 @@ void ASNetwork::Dispose() { } void ASNetwork::Update() { - if( sockets.size() > 0 ) { - int check_counter = SocketData::BUF_SIZE; - while( check_counter > 0 ) { - int nr_sockets = SDLNet_CheckSockets(socketset,0); - if( nr_sockets > 0 ) { - std::map<SocketID, SocketData>::iterator socketit = sockets.begin(); - for(; socketit != sockets.end(); socketit++ ) { - SocketData &sd = socketit->second; - if( SDLNet_SocketReady( sd.socket ) && sd.used < SocketData::BUF_SIZE ) { - int recv_size = SDLNet_TCP_Recv(sd.socket, sd.buf + sd.used, 1); - if( recv_size == 1 ) { - sd.used++; - } else if( recv_size <= 0 ) { - sd.valid = false; - LOGE << "Connection Recv error on " << socketit->first << " : " << SDLNet_GetError() << std::endl; - } - } - } - check_counter--; - } else if( nr_sockets == -1 ) { - LOGE << "Error using select() on socket" << std::endl; - check_counter = 0; - } else { - check_counter = 0; - } - } - - //Offset the calls to allow calls to DestroyTCPSocket. - int id_count = 0; - uint8_t* data[MAX_SOCKETS]; - size_t size[MAX_SOCKETS]; - SocketID id[MAX_SOCKETS]; - - std::map<SocketID, SocketData>::iterator socketit = sockets.begin(); - for(; socketit != sockets.end(); socketit++ ) { - SocketData &sd = socketit->second; - if( sd.used > 0 ) { - data[id_count] = sd.buf; - size[id_count] = sd.used; - id[id_count] = socketit->first; - id_count++; - } else if( sd.valid == false ) { //Note that we use NULL on data as a destroy marker. - data[id_count] = NULL; - size[id_count] = 0; - id[id_count] = socketit->first; - id_count++; - } - sd.used = 0; - } - - for( int i = 0; i < id_count; i++ ) { - if( data[i] == NULL ) { - DestroySocketTCP(id[i]); - } else { - std::vector<ASNetworkCallback*>::iterator cbit = callbacks.begin(); - for(; cbit != callbacks.end(); cbit++ ) { - (*cbit)->IncomingTCPData(id[i], data[i], size[i] ); - } - } - } - } + if (sockets.size() > 0) { + int check_counter = SocketData::BUF_SIZE; + while (check_counter > 0) { + int nr_sockets = SDLNet_CheckSockets(socketset, 0); + if (nr_sockets > 0) { + std::map<SocketID, SocketData>::iterator socketit = sockets.begin(); + for (; socketit != sockets.end(); socketit++) { + SocketData& sd = socketit->second; + if (SDLNet_SocketReady(sd.socket) && sd.used < SocketData::BUF_SIZE) { + int recv_size = SDLNet_TCP_Recv(sd.socket, sd.buf + sd.used, 1); + if (recv_size == 1) { + sd.used++; + } else if (recv_size <= 0) { + sd.valid = false; + LOGE << "Connection Recv error on " << socketit->first << " : " << SDLNet_GetError() << std::endl; + } + } + } + check_counter--; + } else if (nr_sockets == -1) { + LOGE << "Error using select() on socket" << std::endl; + check_counter = 0; + } else { + check_counter = 0; + } + } + + // Offset the calls to allow calls to DestroyTCPSocket. + int id_count = 0; + uint8_t* data[MAX_SOCKETS]; + size_t size[MAX_SOCKETS]; + SocketID id[MAX_SOCKETS]; + + std::map<SocketID, SocketData>::iterator socketit = sockets.begin(); + for (; socketit != sockets.end(); socketit++) { + SocketData& sd = socketit->second; + if (sd.used > 0) { + data[id_count] = sd.buf; + size[id_count] = sd.used; + id[id_count] = socketit->first; + id_count++; + } else if (sd.valid == false) { // Note that we use NULL on data as a destroy marker. + data[id_count] = NULL; + size[id_count] = 0; + id[id_count] = socketit->first; + id_count++; + } + sd.used = 0; + } + + for (int i = 0; i < id_count; i++) { + if (data[i] == NULL) { + DestroySocketTCP(id[i]); + } else { + std::vector<ASNetworkCallback*>::iterator cbit = callbacks.begin(); + for (; cbit != callbacks.end(); cbit++) { + (*cbit)->IncomingTCPData(id[i], data[i], size[i]); + } + } + } + } } SocketID ASNetwork::CreateSocketTCP(std::string host, uint16_t port) { - if( sockets.size() < (unsigned)MAX_SOCKETS ) { + if (sockets.size() < (unsigned)MAX_SOCKETS) { IPaddress adr; - int ret = SDLNet_ResolveHost(&adr, host.c_str(), port); - if( ret == 0 ) { + int ret = SDLNet_ResolveHost(&adr, host.c_str(), port); + if (ret == 0) { TCPsocket tcp_socket; tcp_socket = SDLNet_TCP_Open(&adr); - if( tcp_socket ) { - SDLNet_AddSocket( socketset, (SDLNet_GenericSocket)tcp_socket ); - + if (tcp_socket) { + SDLNet_AddSocket(socketset, (SDLNet_GenericSocket)tcp_socket); + SocketData sd; sd.used = 0; sd.socket = tcp_socket; sd.valid = true; - SocketID socket_id = socket_id_counter++; + SocketID socket_id = socket_id_counter++; sockets[socket_id] = sd; return socket_id; - } - else - { + } else { LOGE << "Unable to open socket to resolved address: " << host << ":" << port << std::endl; - LOGE << "Error: " << SDLNet_GetError() << std::endl; + LOGE << "Error: " << SDLNet_GetError() << std::endl; } - } - else - { + } else { LOGE << "Unable to resolve host " << host << ":" << port << std::endl; } - } - else - { + } else { LOGE << "Unable to create another socket connection, reached max of: " << MAX_SOCKETS << std::endl; } @@ -145,21 +139,21 @@ SocketID ASNetwork::CreateSocketTCP(std::string host, uint16_t port) { void ASNetwork::DestroySocketTCP(SocketID sock) { std::map<SocketID, SocketData>::iterator datait = sockets.find(sock); - if( datait != sockets.end() ) { + if (datait != sockets.end()) { SDLNet_DelSocket(socketset, (SDLNet_GenericSocket)datait->second.socket); SDLNet_TCP_Close(datait->second.socket); - sockets.erase(datait); + sockets.erase(datait); } } int ASNetwork::SocketTCPSend(SocketID socket, const uint8_t* buf, size_t len) { std::map<SocketID, SocketData>::iterator datait = sockets.find(socket); - if( datait != sockets.end() ) { - SocketData &sd = datait->second; - int ret_data_size = SDLNet_TCP_Send( sd.socket, buf, len ); - if( ret_data_size < (int)len ) { + if (datait != sockets.end()) { + SocketData& sd = datait->second; + int ret_data_size = SDLNet_TCP_Send(sd.socket, buf, len); + if (ret_data_size < (int)len) { sd.valid = false; - DestroySocketTCP(socket); + DestroySocketTCP(socket); LOGE << "Error when trying to send data on socket, error: \"" << SDLNet_GetError() << "\", shutting it down." << std::endl; } return ret_data_size; @@ -171,20 +165,20 @@ int ASNetwork::SocketTCPSend(SocketID socket, const uint8_t* buf, size_t len) { bool ASNetwork::IsValidSocketTCP(SocketID socket) { std::map<SocketID, SocketData>::iterator datait = sockets.find(socket); - if( datait != sockets.end() ) { + if (datait != sockets.end()) { return true; } else { return false; } } -void ASNetwork::RegisterASNetworkCallback( ASNetworkCallback* cb ) { +void ASNetwork::RegisterASNetworkCallback(ASNetworkCallback* cb) { callbacks.push_back(cb); } -void ASNetwork::DeRegisterASNetworkCallback( ASNetworkCallback* cb ) { - std::vector<ASNetworkCallback*>::iterator callit = std::find(callbacks.begin(), callbacks.end(),cb); - if( callit != callbacks.end() ) { - callbacks.erase(callit); +void ASNetwork::DeRegisterASNetworkCallback(ASNetworkCallback* cb) { + std::vector<ASNetworkCallback*>::iterator callit = std::find(callbacks.begin(), callbacks.end(), cb); + if (callit != callbacks.end()) { + callbacks.erase(callit); } } |