PDA

Visualizza la versione completa : [C++\C#] Utilizzo di Pipe in modo non bloccante


CyberCrasher
08-10-2012, 18:56
Ciao a tutti,
dovendo far comunicare due applicazioni scritte in c# e in c++ vorrei valutare il sistema più opportuno.

Il metodo più simpatico mi sembra quello delle pipe named ma se ho capito bene è necessario l'utilizzo di connect() che è bloccante.

Il problema è che è possibile che uno dei due processi non sia attivo o non disponibile o bloccato quindi avrei la necessità di tentare una connessione ma con timeout e se ho capito bene con pipe questo non è consentito.
Ho già letto diverse guide ma considerando che è la prima volta che mi imbatto nei sistemi IPC sotto Windows, vorrei qualche consiglio da voi prima di scrivere codice inutile e inopportuno.
Grazie anticipatamente :)

shodan
08-10-2012, 19:04
Io ho risolto il problema usando un thread a parte con un apposito timeout.
Se il timeout scade e il thread risulta bloccato, accoppi il thread e segnali la cosa.

CyberCrasher
08-10-2012, 19:08
Bè, è un'ottima idea ma essendo il mio un progetto universitario penso che il mio prof mi ucciderebbe vedendo una cosa del genere :)

Un'altra possibilità potrebbe essere il FileMapping ma mi sembra un po' più complicato e avendo dati di lunghezza variabile non vorrei incasinarmi le cose

c0der
08-10-2012, 19:12
Io intanto butto lì una pagina da msdn, può sempre servire:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx

CyberCrasher
08-10-2012, 19:28
Altri metodi richiedono spesso la sincronizzazione.
Potenzialmente ho la possibilità di condividere qualche handle di sincronizzazione o qualcosa del genere tra i due processi (visto che condividono una dll) ma vorrei evitare di complicarmi la vita.

Vorrei fare qualcosa di semplice e per questo le pipe mi sembrano le più adatte e automatizzate. L'unico problema è il blocco di connessione! La versione non-bloccante delle pipe sembrerebbe la MailSlot che è un sistema connectionless utilizzato per broadcast ma purtroppo è stato deprecato in c# e sinceramente mettermi di nuovo a fare marshall non mi pare una grande idea. Spero che qualcuno mi dia qualche informazione illuminante sulle pipe

c0der
08-10-2012, 20:10
Per capire meglio, che cosa devi condividere tra i due processi?
Si tratta di un modello produttore/consumatore oppure è una variabile di stato che entrambi possono aggiornare oppure ...

CyberCrasher
08-10-2012, 21:41
Immagina una lista di cose da comprare: string int float

Latte 10 10,3
Pane 1 43,2
Farina 3 34,2

Il numero di oggetti della lista non è conosciuto a priori tra i due processi, ma il numero di parametri si (ovvero string int float)

c0der
08-10-2012, 21:46
Ok, ma questa lista la produce uno solo dei processi e l'altro è in attesa che un nuovo elemento venga scritto
o è prodotta da entrambi o ...

CyberCrasher
08-10-2012, 22:03
Si è unidirezionale. Un processo sollecita il servizio ad inviarli tramite un ServiceControlCode quindi si mette in attesa per ricevere questi dati.

Tuttavia questi dati potrebbero non arrivare per qualche motivo quindi non posso aspettare con un sistema bloccante. Un timeout sarebbe perfetto

c0der
08-10-2012, 22:16
Ora è più chiaro e a uno verrebbe da dire è un caso perfetto per un socket o una named pipe, dove il server è quello che produce questa lista.

Non mi diventa più chiaro quando dici che i "dati potrebbero non arrivare per qualche motivo quindi non posso aspettare con un sistema bloccante". Se non arrivano più i dati sarà perché il processo server è uscito per qualche errore immagino e a questo punto cosa ci sta a fare l'altro processo da solo?

Oppure tu vuoi un sistema diciamo client/server dove il client regolarmente controlla se il server è su o meno, Se è attivo ci si connette e scarica i dati, ma il server può essere chiuso in qualunque momento e il client deve essere in grado di gestire la situazione e provare a riconnettersi quando il server riparte.

[EDIT] Se il tuo caso è l'ultimo che ti ho descritto prova a guardare qui riguardo al riconettersi a una named pipe rotta:
http://stackoverflow.com/questions/6961240/problem-reconnecting-to-the-named-pipe
e più in generale qui, ma lo conoscerai già (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365592%28v=vs.85%29.aspx)

Loading