2011-01-03 4 views
3

HttpWebRequest 및 HttpWebResponse가 제공하는 것보다 낮은 수준의 웹 사이트에 연결할 때 어떤 일이 벌어지고 있는지에 대한 자세한 정보를 얻으려고합니다. C#을 사용하고 있습니다.HttpWebRequest/Response에서 기본 TCP 연결 가져 오기

DNS 조회 및 새로운 연결이 설정된 경우 연결을 설정하는 데 걸린 시간에 대한 정보를보고 싶습니다. HttpWebRequest와 HttpWebResponse는 이것보다 높은 수준에서 작동하며 기본 TcpClient 객체 (또는 저수준 객체 사용)를 얻는 방법이 있는지 묻고 싶습니다.

가능하지 않은 경우 .net이 HttpWebRequest 또는 HttpWebResponse를 통해 가져 오지 않고 유지하는 연결 목록을 잡고 조작하는 방법이 있습니까?

모든 HTTP 항목을 안정적으로 구현하는 데 너무 많은 시간이 소요될 수 있기 때문에 TcpClient를 사용하려고하는 응용 프로그램을 변경할 수 없습니다.

+1

'TcpClient'에 대해 확실하지 않지만 'Socket'클래스를 사용하므로이 패키지를 찾으십시오. 또한 중단 점과 디버그를 수행 할 때 개체를 가리키고 개인 멤버도 볼 수 있습니다. 그것은 당신에게 어떤 방향을 제시합니다. – Poni

+0

나는 사립 회원들을 보려고 생각하지 않았다. 고마워. 불행하게도 나는 많이 찾을 수 없었다. ServicePoint에는 LastDnsResolve라는 비공개 변수가 있다는 것을 알았습니다. 마지막 변수는 마지막 DNS 확인 시간입니다. 나는 작은 문제에 그것을 사용할 수 있을지 모른다. – Zane

답변

3

난 당신이 다음과 같은 정보와 함께 app.config 파일을 만드는 것입니다 얻을 수있는 가장 좋은 :

<?xml version="1.0" encoding="UTF-8" ?> 
<configuration> 
    <system.diagnostics> 
     <trace autoflush="true" /> 
      <sources> 
       <source name="System.Net" maxdatasize="1024"> 
        <listeners> 
         <add name="MyTraceFile"/> 
        </listeners> 
       </source> 
       <source name="System.Net.Sockets" maxdatasize="1024"> 
        <listeners> 
         <add name="MyTraceFile"/> 
        </listeners> 
       </source> 
      </sources> 


      <sharedListeners> 
       <add 
        name="MyTraceFile" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="System.Net.trace.log" 
       /> 
      </sharedListeners> 
      <switches> 
       <add name="System.Net" value="Verbose" /> 
       <add name="System.Net.Sockets" value="Verbose" /> 
      </switches> 
    </system.diagnostics> 
</configuration> 

이 추적을 사용하고 "System.Net.trace라는 이름의 로그 파일을 쫓아 것입니다. 로그 "귀하의 응용 프로그램 폴더에. 앱을 실행하는 동안 찾고있는 정보를 모두 얻을 수는 없지만 적어도 타사 프로그램을 실행할 필요는 없습니다. 그것의 너무 많은 문서화가 아니지만 최소한 some information 밖에있다.

+2

이 아이디어를 바탕으로 모든 TraceListener를 추적 할 수있는 자체 TraceListener를 작성할 수 있습니다. 런타임에 동일한 프로세스에 로그합니다. –

+0

좋은 지적 @Stephen Cleary! –

+0

감사합니다. 가까운 것으로 보입니다. TraceListener를 제안대로 작성했으며 소켓 추적에서 일부 정보를 얻을 수 있습니다. 불행히도 그러나 특정 HttpWebResponse 연결된 소켓 정보를 보여주는 특정 추적 항목을 일치시킬 수 없습니다. – Zane

2

Wireshark를 사용하면 모든 것을 찾아내는 가장 좋은 방법입니다.

+0

동의합니다. HttpWebRequest의 요점은 복잡한 부분을 추상화하거나 숨기는 것입니다. 사용 편의성에 대한 절충은 하위 레벨에서 "마법"을 받아 들여야한다는 것입니다. –

+0

동의합니다. .net의 내부 구조에 대해 신경 쓰지 말고, 그들이 전선을 지나갈 때 요청을 감시하십시오. 이렇게하면 모든 일이 언제 발생하는지 정확한 타이밍을 알 수 있습니다. – NotMe

+0

나는 wireshark를 사용하지만, 똑같은 일을하고 싶습니다 .net : tcp 연결을 모니터하십시오. 내 질문에 분명하지 않을 수도 있습니다, 나는 정보를 반복적으로 자동으로 얻을 수 있도록하고 싶습니다 .net 한 번만 문제 해결을 위해. 당신이 WinPcap이나 Wireshark API를 사용할 것을 제안하지 않았다면 (존재합니까?). 하지만 그것은 다른 차원으로 옮겨 가고 있습니다. 가능하다면 그것을 피하고 싶습니다. – Zane

1

Wireshark가 아닌 경우 Fiddler을 사용하십시오.

+0

나는 바이올린도 사용합니다. 그러나 그것이 저를 생각하게합니다. 바이올린 연주자는 어떻게 통계 정보를 얻습니까? TCP/IP 연결 시간을보고하며 C#으로 작성됩니다. 그것은 TcpClient/소켓을 사용합니까? Fiddler는 할 수있는 일이 매우 광범위합니다. 나는 그것이 잘못되었다는 것을 느끼기 때문에 그것을 해체하고, 그것이 어떻게 끝났는지보고 나서 동일한 생각을 사용하는 것을 너무 유죄로 느낄 것이다. (그리고 그것은 아마도 불법이다.) – Zane

+2

Fiddler는 HTTP 프록시입니다. Fiddled는 브라우저에서 켜져 있고 다른 HTTP 클라이언트는 로컬 프록시 (Fiddler)에 요청을 보내고 실제 서버로 다시 보냅니다. 결과적으로 요청 및 응답에 대한 모든 것을 알고 있기 때문에 스스로를 보냅니다. 하지만 원래의 질문에서 필요한 것처럼 들리지는 않습니다 - 프로세스에 HTTP/TCP 통계가 필요합니다 ... –