Newsgroup: it.comp.programmare.win32
Titolo: Socket, processi e redirezione I/O

Ciao a tutti!
Il mio problema è il seguente: ho un socket, connesso, di handle hSocket.
Devo eseguire un'applicazione console in modo che l'output di quest'ultima
venga trasmesso attraverso il socket, e l'input venga ricevuto sempre
tramite lo stesso socket.
Ho provato ad eseguire CreateProcess specificando, nella struttura
StartupInfo, il valore hSocket nei campi hStdInput, hStdOutput e hStdError e
impostando wShowWindow a SW_HIDE in modo da nascondere la console
all'utente. Ovviamente ho impostato il valore corretto in dwFlags.
Inutile dire che non funziona: l'applicazione console viene eseguita
correttamente, ma l'I/O non viene rediretto sul socket.
Devo impostare qualche parametro particolare tramite setsockopt() o altro
per poter utilizzare hSocket come stream di I/O in CreateProcess?
Grazie a tutti,
    Marco

 correttamente, ma l'I/O non viene rediretto sul socket.
Non credo che sotto a Windows possa funzionare, i socket non vengono
considerati come dei normali file handle. Un modo che funziona
sicuramente e` quello di creare due anonymous pipes con CreatePipe() e
usare quelle come "tramite" fra CreateProcess() e i socket, ovviamente
aggiungendo il codice necessario per leggere e scrivere i dati dalle due
parti.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 parti.
So che con le anonymous pipes funziona, il fatto è che devo cercare di
tenere il codice più snello possibile, e siccome si tratta di
un'applicazione multi-threaded non sarebbe agevole inserire un ulteriore
"canale" di comunicazione in mezzo (anche se ovviamente dovrò fare così se
non risolvo il problema in un altro modo)...
Comunque anche in Win32 si può fare, ti riporto un breve cut&paste della
documentazione relativa al parametro hFile della funzione ReadFile (fonte:
MSDN):
//////////////////////
hFile
Windows NT:
For asynchronous read operations, hFile can be any handle opened with the
FILE_FLAG_OVERLAPPED flag by the CreateFile function, or a socket handle
returned by the socket or accept functions.
//////////////////////
(la stessa cosa viene detta a proposito di Win95/98).
Documentandomi meglio ho scoperto che, per permettere questo genere di
operazione sul socket, bisogna creare quest'ultimo in modalità sincrona
tramite l'opzione SO_OPENTYPE, ma non ho trovato dettagli più specifici (è
una di quelle cose Microsoft-specific che, paradossalmente, su MSDN quasi
non sono documentate...).
Comunque grazie del suggerimento. :-)
    Marco

 returned by the socket or accept functions.
Wow, non credevo. :)


> considerati come dei normali file handle.
I socket sono nati come un'estensione dei file...
MJ> Comunque anche in Win32 si può fare, ti riporto un breve cut&paste della
MJ> documentazione relativa al parametro hFile della funzione ReadFile (fonte:
MJ> MSDN):
MJ> //////////////////////
MJ> hFile
MJ> Windows NT:
Windows NT, non tutto Win32, ovvero in Windows 9x non è implementato. Non
è che sei sotto Windows 9x ?
\begin{avviso}
 
Attenzione: Leggersi lo header riguardo al mio e-mail!
Warning: read header for infos about my e-mail.
\end{avviso}
+----------------------------------------------------------------+
| Gian Uberto Lauri * "So, are you working on fixing that bug    |
| 
sa...@eng.it
      *  *now* or leaving it until later ?" - YES  |
+----------------------------------------------------------------+

Oggi ho fatto una prova sotto WinNT e, impostando l'opzione SO_OPENTYPE sul
socket, funziona tutto alla perfezione. Evidentemente come dici tu il
problema è il sistema operativo, anche se su MSDN sembra specificato il
contrario:
///////////////// MSDN ////////////////
Windows NT:
For asynchronous read operations, hFile can be any handle opened with the
FILE_FLAG_OVERLAPPED flag by the CreateFile function, or a socket handle
returned by thesocket oraccept functions.
Windows 95:
For asynchronous read operations, hFile can be a communications resource,
mailslot, or named pipe handle opened with the FILE_FLAG_OVERLAPPED flag by
CreateFile, or a socket handle returned by the socket or accept functions.
Windows 95 does not support asynchronous read operations on disk files.
///////////////////////////////
Da quanto esposto sopra sembra che la ReadFile possa leggere (e la WriteFile
possa scrivere) anche direttamente sul socket, sia sottoWinNT che sotto
Win95... Allora, se ciò è possibile, dovrebbe essere possibile anche la
redirezione dell'I/O su socket nelle applicazioni console, visto che
sfruttano ReadFile e WriteFile per le operazioni di input/output!
    Marco