Después de enviar mucho, mi llamada send () hace que mi programa se detenga por completo. ¿Cómo es esto posible?

Básicamente, estoy haciendo un servidor MMO en C ++ que se ejecuta en Linux. Al principio funciona bien, pero después de unos 40 segundos con 50 clientes se detendrá por completo. Cuando lo depuro, encuentro que, básicamente, el último marco en el que está encendido antes de que deje de responder es syscall (), en cuyo punto desaparece en el núcleo. Una vez que desaparece en el núcleo, ni siquiera devuelve un valor ... es completamente desconcertante.

Cada uno de los 50 clientes envía 23 bytes cada 250 milisegundos. Estos 23 bytes se transmiten a todos los otros 49 clientes. Este proceso comienza a ralentizarse y luego se detiene por completo donde el kernel nunca regresa de una llamada al sistema para el comando send (). ¿Cuáles son algunas posibles razones aquí? ¡Esto realmente me está volviendo loco!

Una opción que encontré es el algoritmo de Nagles que fuerza los retrasos. He intentado alternarlo, pero aún así sucede.

Editar: el programa está atascado aquí. Específicamente, en el envío, que a su vez llama a syscall ()

bool EpollManager::s_send(int curFD, unsigned char buf[], int bufLen, int flag) 
//     Meant to counteract partial sends
{
    int sendRetVal = 0;
    int bytesSent = 0;
    while(bytesSent != bufLen)
    {
 print_buffer(buf, bufLen);
        sendRetVal = send(curFD, buf + bytesSent, bufLen - bytesSent, flag); 

        cout << sendRetVal << " ";
        if(sendRetVal == -1)
        {
            perror("Sending failed");
            return false;
        }
        else
            bytesSent += sendRetVal;
    }
    return true;
}

Además, este es el método que llama a s_send.

    void EpollManager::broadcast(unsigned char msg[], int bytesRead, int sender)
    {
 for(iMap = connections.begin(); iMap != connections.end(); iMap++)
 {
  if(sender != iMap->first)
  {
   if(s_send(iMap->first, msg, bytesRead, 0)) // MSG_NOSIGNAL
   {
       if(debug)
       {
                    print_buffer(msg, bytesRead);
                    cout << "sent on file descriptor " << iMap->first << '\n';
       }
   }
  }
 }
 if(connections.find(sender) != connections.end())
        connections[sender]->reset_batch();
    }

Y para aclarar las conexiones es una instancia de unordered_map. Los datos con los que el programa se ahoga tampoco son únicos de ninguna manera. Se ha transmitido con éxito a otros descriptores de archivos, pero se ahoga en uno, al menos aparentemente aleatorio.

Respuestas a la pregunta(2)

Su respuesta a la pregunta