0
구현하려고하는 간단한 디자인이 있습니다.XP에서 원격 명명 된 파이프 연결이 거부되었습니다.
단일 C++ 기반 서버 응용 프로그램은 쓰기 전용 명명 된 파이프를 만듭니다. 여러 클라이언트 (C++ 또는 C#)는 읽기 전용으로 연결하고 상태 메시지를 수신합니다.
로컬 프로세스에서이 작업을 수행하지만 다른 호스트의 클라이언트를 서버에 연결할 수 없습니다.
서버가 XP SP2 (어쩌면 SP3)에서 실행 중입니다. 클라이언트가 Win7에서 실행 중입니다.
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
SID_IDENTIFIER_AUTHORITY siaWorldSidAuthority = SECURITY_WORLD_SID_AUTHORITY;
PSID psidWorldSid = (PSID) LocalAlloc (LPTR, GetSidLengthRequired(1));
InitializeSid(psidWorldSid, &siaWorldSidAuthority, 1);
*(GetSidSubAuthority(psidWorldSid, 0)) = SECURITY_WORLD_RID;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorGroup(&sd, psidWorldSid, TRUE);
ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = FALSE;
HANDLE hPipe = CreateNamedPipe(
lpszPipename, // name
PIPE_ACCESS_OUTBOUND, // write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
NULL /*&sa*/); // no security attribute
최종 PARAM에 & SA로 대체 NULL은 효과가 없다. C# 클라이언트 코드는 다음과 같습니다.
SafeFileHandle pipeHandle =
CreateFile(
pipeName,
GENERIC_READ,
0,
IntPtr.Zero,
OPEN_EXISTING,
0,
IntPtr.Zero);
무엇이 바보 같은 일로 여기에 있습니까?
XP가 Win7 호스트의 VM에서 실행 중입니다. 나는 Windows 방화벽이 호스트와 VM 모두에서 비활성화되어 있다고 생각한다. VM 네트워킹 어댑터가 필터링을 수행하지 않는다고 생각합니다. 물론 "믿는다"라는 단어는 여기에서 중요한주의 사항입니다. –
한편, 이전에 클라이언트와 서버가 같은 시스템에 있었을 때 "\\. \ pipe \ foo"라는 파이프를 사용하는 대신 "\\ 12.34.56.78 \ pipe \ foo "(물론, 실제 IP 주소와 함께) - 두 프로세스가 모두 로컬 일 때도 연결에 실패한 것으로 보입니다. –
Josh, XP에서 명명 된 파이프를 사용하는 방법에 대한 KB 기사를 찾았습니다. 관련된 몇 가지 설정이 있습니다 ... http://support.microsoft.com/kb/925890 –