使用插座可以降低速度

时间:2014-01-30 13:38:06

标签: c# sockets

美好的一天!我有一个程序,使用套接字来解析网址中的一些信息。编程来自线程的一些代码:

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但经过一段时间后它会下降并变为10-15mbit / s。帮帮我找出原因?有些连接没有关闭吗?

事情是,我有一些不同的网址列表,我在线程中旋转并制作Get响应。这是我的线程代码。我使用套接字写//请求的地方包含我在主题顶部描述的请求代码。

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++;
}
}

1 个答案:

答案 0 :(得分:0)

您应该使用StringBuilderAppend而不是content = content + ...。这会每次都复制字符串。

另外,您是否认为您的代码可能没有问题,但服务器?也许服务器速度慢了?

并且:您测量费率的代码在哪里?我在你的样本中看不到它?