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++;
}
}
不是一個答案,而是一個提示:你不需要調用'Close' /'Dispose'作爲's'在using語句中使用,它將關閉並處理該對象。 – Abbas
任何你沒有使用['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套接字重用? –
是什麼讓你認爲返回的內容使用你的默認本地編碼? –