Servidor TCP que recibe datos antes de responder



  • Hola, he programado un servidor TCP a partir del ejemplo de FortuneServer al que el cliente envía datos al inicio de la conexión.

    El cliente es un arduino Mega con el siguiente código para conectarse al servidor:

    void conectar_ethernet() { //Conecta al servidor
      if (!cliente.connected()) { //Si no se ha conectado al servidor
        estado_conexion = cliente.connect(servidor_remoto, puerto_remoto); // Conexión a servidor
        unsigned long tiempoAnterior = millis();
        Serial << "Conectando a servidor..." << endl;
        if (millis() < (tiempoAnterior + 500)) { //Retardo entre reconexiones
          anteriormente_conectado = false;
          switch (estado_conexion) {
            case 1:
              Serial << "Conexión establecida correctamente. Servidor:" << servidor_remoto << puerto_remoto << endl;
              anteriormente_conectado = true;
              //Envio trama de estado
              Serial << "Envio trama de estado de Arduino" << endl;
              char trama[25];
              datosEnviar.toCharArray(trama, datosEnviar.length()); //Paso String a char[]
              cliente.write(trama, 25);
              break;
            case -1:
              Serial << "Ha pasado el tiempo de espera sin que se establezca la conexión. Servidor:" << servidor_remoto << ":" << puerto_remoto << endl;
              error[6] = 0; //Error de red
              break;
            case -2:
              Serial << "No se ha encontrado el servidor o no responde correctamente. Servidor:" << servidor_remoto << ":" << puerto_remoto << endl;
              error[6] = 0; //Error de red
              break;
            case -3:
              Serial << "La conexión se ha interrumpido antes de establecerse completamente. Servidor:" << servidor_remoto << ":" << puerto_remoto << endl;
              error[6] = 0; //Error de red
              break;
            case -4:
              Serial << "La respuesta del servidor es incorrecta. Servidor:" << servidor_remoto << ":" << puerto_remoto << endl;
              error[6] = 0; //Error de red
              break;
          } //FIN Switch
        } //FIN IF retardo entre conexiones
        tiempoAnterior = millis();
      } else { //Si se ha conectado al servidor
        leo_servidor(); //Leo un byte mientras este no sea "z", en ese caso desconecto.
      }
    }
    
    

    El servidor me responde correctamente y recojo los datos en Arduino pero no veo la manera de recoger los datos que envía al inicio el cliente.

    El codigo del servidor:

    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(envioTCP()));
    
    void MainWindow::envioTCP(){ //Se ejecuta al haber un cliente conectado, envia fortuna
        QByteArray block; //Array de Bytes que contiene trama para enviar al cliente
        QDataStream out(&block, QIODevice::WriteOnly);
        out.setVersion(QDataStream::Qt_4_0);
        out << (quint16)0;
        out << fortunes.at(qrand() % fortunes.size());
        out.device()->seek(0);
        out << (quint16)(block.size() - sizeof(quint16));
        
        
        QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
        connect(clientConnection, SIGNAL(disconnected()),
                clientConnection, SLOT(deleteLater()));
        clientConnection->write(block);
        //clientConnection->disconnectFromHost(); //Comentado porque es el cliente el que cierra la conexion tras recibir caracter de fin de trama
    }
    

    Se puede hacer lo que quiero o lo estoy planteando mal?


Log in to reply