1 votos

Socket TCP de mbed OS 5

Tengo algunas preguntas sobre la nueva API TCP de mbed OS 5:

Algunos antecedentes:

Tendré varias mbeds conectadas por Ethernet a un PC. El PC, cuya dirección IP es fija y conocida por cada mbed, inicia las conexiones (los mbeds actúan de hecho como servidores).

El mbed sólo necesita manejar un socket a la vez, y el PC no debería tener ningún problema para volver a conectarse (abriendo así un socket en el mbed) al mbed, si la conexión falla en algún momento, o el socket es cerrado por el PC (es decir, el mbed debería aceptar y abrir felizmente un socket si no hay ningún socket abierto).

Pregunta

Mi propuesta sería llamar a accept() en el socket de escucha, almacenando el resultado en un buffer temporal. Si el resultado es NULL (no hay socket que aceptar), continuar. Si el resultado no es NULL (tenemos un puntero a un nuevo socket), cerrar el socket actual, y apuntarlo a la dirección devuelta por accept. Todo esto, así como las llamadas a send() y recv() ocurrirían en un bucle while(true).

Al devolver accept() un nuevo socket, se asume que el host (PC) inició una nueva conexión debido a que la anterior (que el mbed no tiene forma de saber que ahora está perdida) se perdió/cerró. Por lo tanto, no debería haber ningún problema en descartar el socket actual y reemplazarlo por el nuevo.

¿Le parece un planteamiento sensato?

EDITAR:

Se me ha ocurrido un ejemplo de lo que describía más arriba. No se ha probado, pero debería transmitir la idea.

#include "mbed.h"
#include "EthernetInterface.h"

// Network interface
EthernetInterface net;

TCPSocket listener;
TCPSocket* client;

// Socket demo
int main()
{

    int remaining;
    int rcount;
    char *p;
    char *buffer = new char[256];
    nsapi_size_or_error_t result;

    net.set_network("192,168,0,101","192,168,0,101","192,168,0,101");
    net.connect();

    listener.open(&net);
    listener.bind(80);

    listener.listen(1);

    client = listener.accept(NULL);
    client->set_timeout(1000);

    while(1) {

        int remaining = 256;
        int rcount = 0;
        p = buffer;

        while (remaining > 0 && 0 < (result = client->recv(buffer, remaining))) {
            p += result;
            rcount += result;
            remaining -= result;
        }

        if (result == 0) { //Peer has shutdown connection
            client->close(); //close socket;

            client = listener.accept(NULL); //block again until new connection comes through
            client->set_timeout(1000);
        }

        if (result == NSAPI_ERROR_TIMEOUT ) { //Assume connection has been lost
            client->close(); //close socket;

            client = listener.accept(NULL); //block again until new connection comes through
            client->set_timeout(1000);

        }

    }

}

0voto

ashkanr Puntos 343

¿Por qué no utilizar UDP en este caso? No habrá que abrir ningún socket, simplemente puedes escuchar en un socket de la placa Mbed y los ordenadores pueden enviar datos al puerto. No hay problema en abandonar los sockets.

Observe que aquí tenemos un ejemplo de servidor web HTTP 1.1 multihilo: http-webserver-example si necesitas algo de inspiración para construir servidores TCP sobre Mbed OS.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X