2014-01-30 74 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 /秒,但一段時間後,它正在減少,併成爲10-15mbit /秒。幫我找出原因?有一些連接沒有關閉?

事情是,有不同的網址列表,我在線程中旋轉並獲取響應。在這裏我的線程代碼。我寫的//使用套接字請求的地方包含我在主題頂部描述的請求代碼。

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

不是一個答案,而是一個提示:你不需要調用'Close' /'Dispose'作爲's'在using語句中使用,它將關閉並處理該對象。 – 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

您應該使用StringBuilderAppend到它,而不是使用content = content + ...。這每次都會複製字符串。

另外,你認爲這可能是你的代碼沒有問題,但服務器?也許服務器變慢?

而且:你在哪裏測量碼率的代碼?我在你的樣品中看不到它?