2012-04-09 9 views
2

Ich habe mir den Kopf kratzt und suche seit Stunden eine Antwort dafür. Grundsätzlich öffne ich einen Sockel für eine andere Maschine und lese die Daten daraus. Dieser Socket wird dann über einen fdopen-Aufruf, der im int den Socket repräsentiert, in ein Datei-Handle "konvertiert". Die resultierende Dateikennung wird dann an einen Bison-Parser übergeben, der die über den Socket empfangenen Daten direkt analysiert. All das funktioniert gut auf Linux. Jetzt habe ich versucht, diesen Code in Windows zu portieren, und ich versage schade. Der Code sieht etwa so aus:Winsock-Socket als Datei-Handle

 FILE* fileHandle; 
     #if defined WINCE || defined WIN32 
     int fd = _open_osfhandle(socket, _O_RDONLY); 
     if (fileHandle = fdopen(fd, "r")) { 
     #else 
     if (fileHandle = fdopen(socket, "r")) { 
     #endif 
      ... // code to call my parser with fileHandle as argument 

Der Bison/flex-Parser nicht in der Windows-Version, da die Dateikennung auf eine leere Strom/Datei zu zeigen scheint. Kann jemand auf eine umfassende Ressource verweisen, die dieses Zeug erklärt oder auf eine alternative Lösung hinweist?

Vielen Dank und beste Grüße,

André

Antwort

6

In Windows ist ein Socket-Handle nicht ein Datei-Handle, und man kann sie als solche in der C-API nicht behandeln. In Linux können Sie. Unter Windows kann jedoch ein Socket-Handle an die Funktionen ReadFile/Ex() und WriteFile/Ex() übergeben werden, die trotz ihrer Namen zahlreiche Handle-Typen unterstützen, nicht nur Dateien.

+0

Dies hat mich nicht direkt, da der Code helfen, das nenne ich im Grunde erzeugt wird. Ich kann die Windows-spezifischen Funktionen nicht aufrufen, es sei denn, ich erstelle einen Wrapper oder überschreibe etwas vom Flex/Bison generierten Code, den ich vermeiden möchte. –

+0

Dann haben Sie kein Glück. Sie müssen etwas neu schreiben. Sie können C-Datei-E/A-Funktionen nicht auf einem Socket-Handle in Windows verwenden. –

+0

Yeap das ist auch meine Schlussfolgerung. Teile davon müssen neu geschrieben werden. –

0

Sie müssen zu fälschen ein wenig, aber dieser funktioniert für mich - nSocketFd einen Dateideskriptor Rückkehr von Socket()

FILE* fpSocket = NULL; 

#ifdef WIN32 
    fpSocket = new FILE; 
    fpSocket->_file = nSocketFd; 
    fpSocket->_cnt = 0; 
    fpSocket->_ptr = NULL; 
    fpSocket->_base = NULL; 
    fpSocket->_flag = 0; 
#else 
    // build the file pointer from the file descriptor 
    fpSocket = fdopen (nSocketFd, "rb+"); 
#endif 
Verwandte Themen