Comunicazione server-client asincrona multidirezionale sullo stesso socket aperto?

StackOverflow https://stackoverflow.com/questions/1241

  •  08-06-2019
  •  | 
  •  

Domanda

Ho un'app client-server in cui il client si trova su un dispositivo Windows Mobile 6, scritto in C++ e il server è su Windows completo e scritto in C#.

Inizialmente, ne avevo bisogno solo per inviare messaggi dal client al server, con il server che restituiva solo una conferma di ricezione del messaggio.Ora vorrei aggiornarlo in modo che il server possa effettivamente inviare un messaggio al client per richiedere dati.Poiché attualmente l'ho impostato in modo che il client sia solo in modalità di ricezione dopo aver inviato i dati al server, ciò non consente al server di inviare una richiesta in qualsiasi momento.Dovrei aspettare i dati del cliente.Il mio primo pensiero sarebbe quello di creare un altro thread sul client con un socket aperto separato, in ascolto per le richieste del server... proprio come il server ha già fatto rispetto al client.Esiste un modo, all'interno dello stesso thread e utilizzando lo stesso socket, affinché tutti i server inviino richieste in qualsiasi momento?

Puoi usare qualcosa con l'effetto di WaitForMultipleObjects() e passargli un buffer di ricezione e un evento che gli dice che ci sono dati da inviare?

È stato utile?

Soluzione

Quando avevo bisogno di scrivere un'applicazione con un modello client-server in cui i client potessero uscire ed entrare quando vogliono (presumo che sia anche il caso della tua applicazione dato che usi dispositivi mobili) mi sono assicurato che i client inviassero un in linea messaggio al server, indicando che erano connessi e pronti a fare tutto ciò di cui avevano bisogno.

a quel punto il server poteva inviare messaggi al client attraverso la stessa connessione aperta.

Inoltre, ma non so se questo sia applicabile anche a te, ne ho avuto una specie battito cardiaco i client hanno inviato al server, facendogli sapere che era ancora online.In questo modo il server sa quando un client è stato disconnesso forzatamente dalla rete e potrebbe contrassegnarlo nuovamente come offline.

Altri suggerimenti

L'uso della comunicazione asincrona è totalmente possibile in un unico thread!

Esiste un modello di progettazione comune nello sviluppo del software di rete chiamato modello del reattore (guarda questo libro).Alcune librerie di rete ben note forniscono un'implementazione di questo modello (guarda ACE).

In breve, il reattore è un oggetto, registri tutte le prese al suo interno e aspetti qualcosa.Se è successo qualcosa (sono arrivati ​​nuovi dati, connessione chiusa...) il reattore ti avviserà.E, naturalmente, puoi utilizzare un solo socket per inviare e ricevere dati in modo asincrono.

Non sono chiaro se desideri aggiungere o meno i bit asincroni al server in C# o al client in C++.

Se si intende eseguire questa operazione in C++, le piattaforme Windows desktop possono eseguire I/O socket in modo asincrono tramite le API che utilizzano I/O sovrapposti.Per i socket, WSASend e WSARecv consentono entrambi l'I/O asincrono (leggi la documentazione sui loro parametri LPOVERLAPPED, che puoi popolare con eventi che vengono impostati al completamento dell'I/O).

Non so se le piattaforme Windows Mobile supportano queste funzioni, quindi potresti dover fare qualche ulteriore ricerca.

Guardare asio.È una libreria C++ cross-compatibile per IO asincrono.Non sono sicuro che sarebbe utile per il server (non ho mai provato a collegare una DLL c++ standard a un progetto c#) ma per il client sarebbe utile.

Lo usiamo con la nostra applicazione e ha risolto la maggior parte dei nostri problemi di concorrenza IO.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top