2012-04-09 2 views
2

나는 머리를 긁적이고 몇 시간 동안 이것에 대한 답변을 찾고 있습니다. 기본적으로 내가하는 일은 다른 머신에 소켓을 열고 소켓에서 데이터를 읽는 것입니다. 이 소켓은 소켓을 나타내는 int를 전달하는 fdopen 호출을 통해 파일 핸들로 "변환"됩니다. 그런 다음 결과 파일 핸들은 소켓을 통해 수신 된 데이터를 직접 파싱 한 bison 파서로 전달됩니다. 이 모든 것은 Linux에서 잘 작동합니다. 이제이 코드를 Windows에 이식하려고 시도했지만 실패로 돌아갑니다. 파일 핸들이 빈 스트림/파일을 가리 키도록 보이기 때문에winsock 소켓을 파일 핸들

 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 

들소/플렉스 파서가 윈도우 버전에서 실패 코드는 다음과 같이 보입니다. 아무도이 자료를 설명하거나 대체 솔루션에 대한 힌트를 제공하는 포괄적 인 리소스를 가리킬 수 있습니까?

감사와 안부, 윈도우에서

앙드레

답변

6

는 소켓 핸들은 파일 핸들 아닙니다, 당신은 C API의 같은 취급 할 수 없다. Linux에서는 할 수 있습니다. 그러나 Windows에서는 소켓 핸들을 ReadFile/Ex() 및 WriteFile/Ex() 함수에 전달할 수 있습니다.이 함수는 파일 이름이 아닌 다양한 핸들 유형을 지원합니다.

+0

소켓에 의한 파일 기술자 수익을() nSocketFd. 일부 래퍼를 만들거나 피하기 위해 flex/bison 생성 코드 중 일부를 재정의하지 않으면 윈도우 내부의 특정 함수를 호출 할 수 없습니다. –

+0

그럼 너는 운이 없어. 뭔가를 다시 써야합니다. Windows의 소켓 핸들에서는 C 파일 I/O 함수를 사용할 수 없습니다. –

+0

Yepp도 내 결론입니다. 이 부분을 다시 작성해야합니다. –

0

당신은 가짜 조금 필요하지만,이 사람은 나를 위해 작동 - 이것은 내가 기본적으로 생성되는 전화 코드 때문에 저에게 직접 도움이되지 않습니다

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