Indipendentemente dal linguaggio di programmazione e dalla piattaforma, tanto i sockets sono i sockets ovunque, con poche differenze, la tua situazione è:
- su pc hai uno socket in stato listening su una porta (prendiamo la 12345 per esempio)
- dal palmare ti connetti (sempre usando un socket) a detta porta (di solito in questi casi il bind è su di una porta a caso, prendiamo la 54321)
- questo crea un socket in stato connected tra la 54321/tcp del palmare e la 12345/tcp del pc; in più, la porta 12345/tcp del pc rimane in stato listening.
Il problema è che ora devi gestire il fatto che sul pc hai sia un socket che è pronto a ricevere ulteriori connessioni, sia un socket che è già connesso e pronto ad inviare e ricevere dati. Tradizionalmente in questi casi o si lancia un nuovo thread che si occupa del socket connesso, mentre il vecchio thread rimette la porta in stato di listening e aspetta ulteriori connessioni, oppure si fa del multiplexing utilizzando select (che tra l'altro su .net funziona maluccio, se mi ricordo bene). Con .net c'è qualche possibilità in più in termini di chiamate asincrone, ci avevo giocato un po', il codice ce l'ho a casa.
In pratica - e in pseudo codice c++:
- Codice: Seleziona tutto
//questo è il corpo di ogni thread che gestisce una connessione.
int threadMain(void* args)
{
//args in realtà è un Socket*, vedi sotto
Socket* sock=reinterpret_cast<Socket*>(args);
char hi[]="Hi\n";
sock->send(hi,strlen(hi));
sock->recv(hi,3); //questa è bloccante.
//chiudo il socket (suppongo sia fatto nel distruttore)
delete sock;
return 0;
}
int main()
{
//ok, creo un socket tcp
Socket s=new Socket(SOCK_STREAM);
//lo lego alla porta 12345
s.bind(12345);
//accetto connessioni all'infinito, e per ciascuna avvio un thread distinto
while(true)
{
Socket connected=s.listen();
if(connected==INVALID_SOCKET)
break;
/*
la riga sotto è pseudo codice per avviare un thread, il primo
argomento è la funzione da eseguire nel contesto del nuovo thread
(il thread entry point), la seconda è un puntatore a void che in realtà
è l'argomento da passare al thread
Nota: in c++ non posso passare direttamente connected, in quanto
viene distrutto alla riga successiva perché esce di scope: sono
costretto a passarne una copia con un lifetime diverso. Il problema
non esisterebbe in C# o in java.
*/
createThread(threadMain,(void*)new Socket(connected));
}
return 0;
}
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...