2014-04-15 3 views
1

클라이언트가 연결을 시도 할 때까지 내 명명 된 파이프 서버가 ConnectNamedPipe 함수의 블록 대기를 건너 뛰려고합니다. 그래서 내 코드는 끝날 때까지 ConnetNamedPipe 라인을지나 계속하지만 backgroun에서 열린 파이프 연결을 유지해야합니다. 파이프를 만들 때 PIPE_NOWAIT 모드를 사용하면 imediatelly가 반환되고 클라이언트가 연결되기 전에 파이프가 닫힙니다.명명 된 파이프는 클라이언트가 연결할 때까지 백그라운드에서 클라이언트를 대기합니다.

스레드를 사용하여이 작업을 시도했지만 스레드를 생성하고 스레드 내에서 코드의 ConnectNamedPipe 부분을 실행하더라도 코드가 계속 실행되는 대신이 줄에서 계속 대기합니다. 일단 내 서버 cpp 파일 코드 끝에 도달하면 클라이언트와 파이프에 연결하려고합니다.

내 파이프 :

hPipe = CreateNamedPipe(
    lpszPipename,    
    PIPE_ACCESS_OUTBOUND,  // one way access, only send data 
    PIPE_TYPE_MESSAGE |  // message type pipe 
    PIPE_READMODE_MESSAGE | // message-read mode 
    PIPE_WAIT,     
    PIPE_UNLIMITED_INSTANCES, 
    512, 
    512,     
    0,       
    NULL);      

if (hPipe == INVALID_HANDLE_VALUE) 
{ 
    Out->msg(ERR,"Creating the pipe failed."); 
} 

// Create a thread for this client. 
hThread = CreateThread(
    NULL,    // no security attribute 
    0,     // default stack size 
    InstanceThread, // thread proc 
    (LPVOID) hPipe, // thread parameter 
    0,     // not suspended 
    &dwThreadId);  // returns thread ID 

if (hThread == NULL) 
{ 
    Out->msg(ERR,"Creating the thread failed."); 
} 
else CloseHandle(hThread); 

// Close the pipe. 
CloseHandle(hPipe); 

내 스레드 :

DWORD WINAPI InstanceThread(LPVOID lpvParam) 
{ 
    Out->msg(output::SEV_INFO,"Waiting for client to connect."); 
    fConnected = ConnectNamedPipe(hPipe, NULL) ? //This is where the execution hangs 
    TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); 

    HANDLE hHeap  = GetProcessHeap(); 
    TCHAR* pchReply = (TCHAR*)HeapAlloc(hHeap, 0, BUFSIZE*sizeof(TCHAR)); 

    DWORD cbBytesRead = 0, cbReplyBytes = 0, cbWritten = 0; 
    BOOL fSuccess = FALSE; 
    HANDLE hPipe = NULL; 

// The thread's parameter is a handle to a pipe object instance. 

    hPipe = (HANDLE) lpvParam; 
    uint32_t startTime = time(NULL); 
    uint32_t elapsedTime; 
// Loop until done reading 
    while ((elapsedTime < 60)) 
    { 
     elapsedTime = difftime(time(NULL), startTime); 
     // Write to the pipe. 
     fSuccess = WriteFile(
      hPipe,  // handle to pipe 
      pchReply,  // buffer to write from 
      cbReplyBytes, // number of bytes to write 
      &cbWritten, // number of bytes written 
      NULL);  // not overlapped I/O 

     if (!fSuccess || cbReplyBytes != cbWritten) 
     { 
      Out->msg(ERR,"InstanceThread WriteFile failed."); 
      break; 
     } 
    } 

// Flush the pipe to allow the client to read the pipe's contents 
// before disconnecting. Then disconnect the pipe, and close the 
// handle to this pipe instance. 

    FlushFileBuffers(hPipe); 
    DisconnectNamedPipe(hPipe); 
    CloseHandle(hPipe); 

    HeapFree(hHeap, 0, pchReply); 

    Out->msg(output::SEV_INFO,"InstanceThread exitting.\n"); 
    return 1; 
} 
+0

[Named Pipe 서버, 클라이언트 연결 대기 및 들어오는 데이터에 대한 인터럽트 또는 시간 초과 방법] 가능한 복제본 (http://stackoverflow.com/questions/35828965/named-pipes-server-how-to-interrupt - 또는 - 시간 초과 - 클라이언트 - 연결 대기 -) 대답 –

답변

1

내 클라이언트가 시도 될 때까지 내 명명 된 파이프 서버가 ConnectNamedPipe 함수의 블록 대기를 건너 뛸 수 있도록하기 위해 노력하고있어 잇다.

그래서 당신은 서버에 대해 이야기하고 있습니다.

내 서버에 계속 연결할 수있는 상태에서 내 코드가 ConnectNamedPipe 행을 지나서 계속되도록하고 싶습니다.

그래서 클라이언트에 대해 이야기하고 있습니다.

의미가 없습니다. ConnectNamedPipe()은 서버 측 함수이며 클라이언트가 연결될 때까지 블록을 제외하고 전용 스레드에서 수행하는 데 유용한 것은 없습니다. 그렇게해라.

+0

그것에 대해 미안해. 내 서버 파일에 ConnectNamedPipe 코드가 있습니다. ConnectNamedPipe가 포함 된 스레드에 도달 할 때까지 실행되고 실행됩니다. 그런 다음 클라이언트가 연결될 때까지 기다립니다. 내가 할 수있는 일은 끝까지 내 코드를 계속 실행 한 다음 내 클라이언트가 파이프에 연결할 마지막까지 도달하는 것입니다. – Adilicious

+0

끝까지 계속 달렸습니까? 클라이언트가 연결될 때까지 어떻게 파이프로 무엇을 할 수 있습니까? – EJP

+0

정확히 하하, 나는 클라이언트가 연결되기 전에 먼저 코드에서 수행하고 싶은 다른 것들을 가지고 있습니다. 그래서 코드를 계속 수행하고 이러한 작업을 수행 한 다음 클라이언트 코드를 실행하면 이 파이프에 연결됩니다. – Adilicious