2009-12-27 5 views
0

TcpClient에서 상속하는 클래스가 있습니다. 그 수업에는 응답을 처리 할 수있는 방법이 있습니다. 그 메서드에서 나는 MyBase.GetStream으로 NetworkStream을 얻고 그것을 호출한다.NetworkStream.Read 지연 .Net

이렇게하면 처음 읽는 블록을 너무 오래 쓸 수 있습니다. 그리고 너무 오랫동안 소켓에 많은 양의 데이터가 수신되었지만 임의의 한도에 도달 할 때까지 읽지는 않습니다. Wire Snark 패킷 스니퍼를 사용하여 많은 데이터를 수신하고 있음을 알 수 있습니다.

아주 작은 양 (단지 몇 바이트와 같은)을 사용하지 않도록 recieve 버퍼를 설정했습니다. read 메소드에 전달한 버퍼 바이트 배열과 동일한 작업을 수행했으며 여전히 지연되었습니다.

다른 방법으로 입력하십시오. 나는 600k를 다운로드 중이다. 다운로드에는 5 초가 걸립니다 (서버에 대해 100k/초 이상 연결하면 의미가 있습니다). 초기 읽기 호출은 2 ~ 3 초 걸리고 256 바이트 만 사용할 수 있다고 알려줍니다 (256은 수신 버퍼와 내가 읽는 배열의 크기입니다). 마술처럼 다른 몇 십만 바이트는 256 바이트 청크에서 각각 몇 개의 프로세스 틱에서 읽을 수 있습니다. 패킷 스니퍼 (packet sniffer)를 사용하여, 나는 처음 2-3 초 동안 소켓이 단지 256 바이트 이상을 수신했다는 것을 안다. 내 연결은 3 초 동안 0.25k/초가 아니고 2 초 동안 400k가 아니 었습니다.

들어오는 소켓에서 바이트를 가져 오는 방법은 무엇입니까?

+0

NIC와 앱 사이에 어떤 것이 있습니까? 방화벽, 바이러스 스캐너, CRL, 프록시를 사용하지 않도록 설정하십시오. –

+0

nobugz, 그게 문제였습니다. 내 안티 바이러스 앱 이었어. 그것을 소켓 버퍼에 보내기 전에 특정 바이트를 버퍼링하여 스캔해야합니다. 스캔 할 잘 알려진 포트를 사용하고 있기 때문에 어떤 의미가 있습니다. 나는 그것에 대해 생각하지 않았다는 것을 믿을 수 없다. 답변을 게시하여 좋은 것으로 표시 할 수 있습니다. – Gilbes

답변

0

전에도이 문제가 몇 번 발생했으며 2-3 초의 지연을 초래 한 컴퓨터의 Internet Explorer 설정 (프록시 설정/LAN 설정 등)을 확인하는 것과 관련이있는 것으로 보입니다.

System.Net 네임 스페이스 (예 : WebClient, HttpWebRequest)의 클래스는 첫 번째 요청에서 자동으로이를 수행하는 것으로 보입니다.

IE의 프록시 설정/LAN 설정, 특히 자동 설정 감지 옵션을 끄거나 변경해보십시오. 도움이 될 수 있습니다.

도움이되지 않는 경우이 문서를 참조하십시오 : Mysterious delay on first use of HttpWebRequest.GetRequestStream. 정확히 TcpClient는 아니지만 같은 문제라고 생각합니다.

희망이 도움이됩니다.

+0

좋은 생각이었습니다. 하지만 IE 및 app.config에서 프록시를 감지 할 수 없게되어 지연에 영향을 미치지 않습니다. – Gilbes

1

오픈 소스 C# network library을 작성할 때 비슷한 문제가 발생했습니다. 설정을 시도하십시오 :

tcpClient.NoDelay = true; 
tcpClient.Client.NoDelay = true; 

기본적으로 nagle algorithm 작동이 비활성화됩니다. 아주 작은 양의 데이터를 송수신 할 때 의도적으로 모든 종류의 임의 지연이 발생합니다.