2011-04-13 3 views
0

C#의 Windows에서 명명 된 파이프에 이상한 문제가 발생했습니다.Windows 명명 된 파이프가 네트워크를 통해 작동하지 않습니까?

클라이언트 :

NamedPipeClientStream pipeStream = new NamedPipeClientStream("default-PC","mypipe"); 

    pipeStream.Connect(); 
    BinaryWriter sw = new BinaryWriter(pipeStream); 
    sw.Write((byte[]) data); 

서버 : - "."

NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe"); 
    byte[] dataAll = null; 
    pipeStream.WaitForConnection(); 
    dataAll = new BinaryReader(pipeStream).ReadBytes(1024 * 1000 * 512); 

내가 사용하는 경우 NamedPipeClientStream의 생성자에서 서버 이름으로 모든 것이 올바르게 작동합니다. 즉, 서버가 dataAll 객체를 채 웁니다.

지금 이상한 일이다 다음 데이터가 서버에서 읽을 수 없습니다 위의 코드와 같이처럼 다른 한편으로는 NamedPipeClientStream에 컴퓨터 ("기본-PC")의 네트워크 이름을 넣어 경우 그 서버 코드의 ReadBytes가 인 경우 빈 배열을 반환합니다.

두 개의 다른 컴퓨터에서 서버와 클라이언트를 실행하고 있지만 두 컴퓨터가 동일한 컴퓨터에서 실행되고 있음을 이해할 수 있습니다. 유일한 차이점은 NamedPipeClientStream 의 "server name"매개 변수가 "인지 여부입니다." 또는 실제 네트워크 이름 (또는 심지어 localhost).

아이디어가 있으십니까?

답변

1

그래서 결론은 이것이다 기본 구현은 단일 쓰기 작업에서 최대 64k를 지원하는 전송 계층을 통과합니다. 문제는 당신이 64k 이상 쓰면 예외를 던지는 대신 데이터가 사라진다는 것입니다.

해결책은 NamedPipeClientStream을 직접 사용하고 64KB 미만의 청크로 데이터를 쓰는 것입니다.

+0

@ user357320 : 일반적으로 이는 사실이 아닙니다. 64 비트 Vista 머신에서 코드는 "." 와 은 최소 50MB 이상의 데이터 크기를 나타냅니다. 데이터 크기가 500MB 인 경우 내 서비스 프로세스가 OutOfMemoryException과 충돌하고 "." 및 . –

+0

코드를 Win7 x64 시스템에서 실행했습니다. 아마 구현은 다르지만, 어떤 경우 든 데이터가 64k 이상을 보내려고 시도했을 때 절대 도착하지 않았습니다. 적어도 기본 설정은 있습니다. – Karlth

2

나는 "." 및 "localhost"는 특수한 이름으로 간주되어 일반 네트워크 연결을 사용하지 않고 루프백을 사용합니다.

컴퓨터 이름을 지정하면 자신의 컴퓨터 이름도 표준 네트워크 프로토콜/stack/etc를 사용합니다.

아마도 방화벽 포트를 열어야합니다. TCP 445. 기본적으로으로, Windows는 모든 나가는 통신을 허용합니다. 인바운드 포트 예외 만 추가하면됩니다. 귀하의 구성은 물론 다를 수 있습니다. "."

NamedPipeClientStream에서 서버 이름 매개 변수보다 뭔가 다른 경우 : .NET 3.5 (C#) Named pipes over network

+0

방화벽을 해제했지만 변경 사항이 없습니다. 어쨌든 파이프가 제대로 연결되면 아무 데이터도 통과하지 못하는 것입니다. 또한 "localhost"또는 네트워크 이름도 작동하지 않으며 "." (또는 서버 지정 없음). – Karlth

+0

아, 미안, 나는 그것을 잡지 않았다. 나는 그 때 손실에있다. 방금 두 개의 프로젝트에 코드를 붙여 넣으려고했는데 localhost와 내 실제 워크 스테이션 이름을 모두 사용했습니다. 둘 다 일했다. 내 클라이언트에서는 데이터를 "byte [] data = {1, 2, 3};"로 정의했습니다. – Jim

+0

또한 64 비트 Windows 상자에서 VS 2010, .NET Framework 4 클라이언트 프로필을 사용하고 있습니다. – Jim

관련 문제