void cServer::OnConnectionAccepted(cSocket & a_Socket) { if (!a_Socket.IsValid()) { return; } const AString & ClientIP = a_Socket.GetIPString(); if (ClientIP.empty()) { LOGWARN("cServer: A client connected, but didn't present its IP, disconnecting."); a_Socket.CloseSocket(); return; } LOGD("Client \"%s\" connected!", ClientIP.c_str()); cClientHandle * NewHandle = new cClientHandle(&a_Socket, m_ClientViewDistance); if (!m_SocketThreads.AddClient(a_Socket, NewHandle)) { // For some reason SocketThreads have rejected the handle, clean it up LOGERROR("Client \"%s\" cannot be handled, server probably unstable", ClientIP.c_str()); a_Socket.CloseSocket(); delete NewHandle; return; } cCSLock Lock(m_CSClients); m_Clients.push_back(NewHandle); }
bool cSocketThreads::cSocketThread::SendDataThroughSocket(cSocket & a_Socket, AString & a_Data) { // Send data in smaller chunks, so that the OS send buffers aren't overflown easily while (!a_Data.empty()) { size_t NumToSend = std::min(a_Data.size(), (size_t)1024); int Sent = a_Socket.Send(a_Data.data(), NumToSend); if (Sent < 0) { int Err = cSocket::GetLastError(); if (Err == cSocket::ErrWouldBlock) { // The OS send buffer is full, leave the outgoing data for the next time return true; } // An error has occured return false; } if (Sent == 0) { a_Socket.CloseSocket(); return true; } a_Data.erase(0, Sent); } return true; }