2014-01-30 3 views
0

안녕하세요! URL에서 일부 정보를 구문 분석하기 위해 소켓을 사용하는 프로그램이 있습니다. 여기에 프로그램 스레드에서 일부 코드 :소켓을 사용하면 속도가 느려지고 있습니다.

var hostEntry = Dns.GetHostEntry(host); 

using (s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
{ 
    s.Connect(new IPEndPoint(hostEntry.AddressList[0], 80)); 

    if (!s.Connected) 
     continue; 

    var requestS = "GET http://" + host + " HTTP/1.1" + "\r\n" + 
        "Host: " + host + "\r\n" + 
        "Connection: close\r\n\r\n"; 
    var bytesSent1 = Encoding.Default.GetBytes(requestS); 
    var bytesReceived1 = new Byte[1000]; 

    s.Send(bytesSent1, bytesSent1.Length, 0); 

    var bytes = 0; 

    do 
    { 
     bytes = s.Receive(bytesReceived1, bytesReceived1.Length, 0); 
     content = content + Encoding.Default.GetString(bytesReceived1, 0, bytes); 
    } 
    while (bytes > 0); 

    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, new LingerOption(false, 0)); 
    s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false); 
    s.Shutdown(SocketShutdown.Both); 
    s.Disconnect(true); 
    s.Close(); 
    s.Dispose(); 
} 

처음 속도는 50mbit/S에 관한 것입니다하지만 약간의 시간 후에는 감소 및/s의 10-15mbit하게된다. 이유를 찾도록 도와 주시겠습니까? 종료되지 않은 연결이 있습니까?

제가 스레드에서 회전하고 Get 응답을 만드는 다른 URL 목록이 있습니다. 여기 내 스레드 코드. 내가 소켓을 사용하여 // 요청한 곳은 내가 주제의 맨 위에서 설명한 요청 코드를 포함하고 있습니다.

public void MainThread() 
{ 
List<string> links = new List<string>(); 
// input links code 
foreach (var link1 in links) 
{ 
try 
{ 
var host = new Regex(@"^[^\/]+").Match(link1.Replace("http://", "").Replace("https://", "").Replace("www.", "").TrimEnd('/')).Groups[0].Value; 
string content = ""; 
Socket s = null; 
IPHostEntry hostEntry; 
hostEntry = Dns.GetHostEntry(host);   

// request using sockets 

// here some code to work with answer text 

// another request using sockets 

} 
catch{} 
lock (lockOperations) 
operations++; 
} 
} 
+2

답이 아니라 팁 : 객체를 닫고 처분 할 using 문에서's'가 사용되므로'Close' /'Dispose'를 호출 할 필요가 없습니다. – Abbas

+1

['WebRequest'] (http://msdn.microsoft.com/en-us/library/system.net.webrequest (v = vs.110) .aspx) 또는 ['WebClient']를 사용하지 않은 이유는 무엇입니까? (http://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx)? HTTP 소켓 재사용에 대해 들어 본 적이 있습니까? –

+1

반환 된 콘텐츠가 기본 로컬 인코딩을 사용한다고 생각하게하는 이유는 무엇입니까 ?? –

답변

0

는 대신 content = content + ...를 사용하는 그것 StringBuilderAppend를 사용해야합니다. 매번 문자열을 복사합니다.

또한 코드에 문제가 없지만 서버가 될 수 있다고 생각 했습니까? 서버가 느려지는 것일까 요?

그리고 속도를 측정하는 코드는 어디에 있습니까? 샘플에서 볼 수 없습니까?

관련 문제