C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[22795] [질문] 소켓 공유..(정말 심각함)
널새 [sthouse] 1571 읽음    2002-11-22 19:07
다음은 MSDN에 나온 소켓을 프로세스로 전달하는 방법입니다.
그대로 copy&past를 해보니 잘 되더군요.. 일부는..
그런데.. 문제는 클라이언트로부터 연결이 끊겼을 때 이벤트가 안올라옵니다.
부모쪽도 안올라 오고, 자식쪽도 안올라옵니다.
더 재미있는것은CreateProcess할 때 상속 속성을 FALSE로 하면 연결 끊김이
잘 올라오는 대신 자식쪽으로 소켓이 전달이 안된다는 겁니다.

자식쪽에서 소켓을 TCustomWinSocket으로 생성하는데..
그쪽을 바꾸고 싶어도 꼭 그걸 써야하거든요..
조언 부탁드립니다..
그럼..


부모프로세스..
   OrigSock=accept(listen_socket,(struct sockaddr *)&from,&fromlen);

   if (OrigSock == INVALID_SOCKET)  {
      fprintf(stderr,"accept failed %d\n",GetLastError());
      return -1;
   }
   {
      STARTUPINFO si;
      PROCESS_INFORMATION pi;
      char argbuf[256];

      memset(&si,0,sizeof(si));

      //
      // Duplicate the socket OrigSock to create an inheritable copy.
      //
      if (!DuplicateHandle(GetCurrentProcess(),
            (HANDLE)OrigSock,
            GetCurrentProcess(),
            (HANDLE*)&DuplicateSock,
            0,
            TRUE, // Inheritable
            DUPLICATE_SAME_ACCESS)) {

         fprintf(stderr,"dup error %d\n",GetLastError());
         return -1;
      }
      //
      // Spawn the child process.
      // The first command line argument (argv[1]) is the socket handle.
      //

      wsprintf(argbuf,"child.exe %d",DuplicateSock);
      if (!CreateProcess(NULL,argbuf,NULL,NULL,
               TRUE, // inherit handles
               0,NULL,NULL,&si,&pi) ){
         fprintf(stderr,"createprocess failed %d\n",GetLastError());
         return -1;
      }

      //
      // On Windows 95, the parent needs to wait until the child
      // is done with the duplicated handle before closing it.
      //
      WaitForSingleObject(pi.hProcess, INFINITE);
   }

자식 프로세스...
   main(int argc, char *argv[]){
      SOCKET Sock;

      /* WSAStartup etc. */
      if (2 == argc){
         Sock = atoi(argv[1]);   // use Sock
      }
   }




+ -

관련 글 리스트
22795 [질문] 소켓 공유..(정말 심각함) 널새 1571 2002/11/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.