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);
}
}
}