|
다음은 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
}
}
|