Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用套接字的速度越来越低_C#_Sockets - Fatal编程技术网

C# 使用套接字的速度越来越低

C# 使用套接字的速度越来越低,c#,sockets,C#,Sockets,你好!我有一个程序,它使用套接字解析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.Conn

你好!我有一个程序,它使用套接字解析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,但一段时间后速度逐渐降低,并变为10-15mbit/s。帮我找出原因?有一些连接没有关闭

问题是,有一个不同的URL列表,我在线程中旋转并做出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++;
}
}
public void主线程()
{
列表链接=新列表();
//输入链接代码
foreach(链接中的变量link1)
{
尝试
{
var host=new Regex(@“^[^\/]+”).Match(link1.Replace(“http://”).Replace(“https://”).Replace(“www.,”).TrimEnd(“/”)).Groups[0]。值;
字符串内容=”;
套接字s=null;
IPHostEntry-hostEntry;
hostEntry=Dns.GetHostEntry(主机);
//使用套接字请求
//下面是一些使用答案文本的代码
//另一个使用套接字的请求
}
捕获{}
锁定(锁定操作)
操作++;
}
}

您应该使用
StringBuilder
附加
,而不是使用
content=content+…
。这将每次复制字符串

<>你也认为你的代码可能没有问题,但是服务器呢?也许服务器速度变慢了


还有:你测量速率的代码在哪里?我在您的示例中看不到它?

不是答案,而是提示:您不需要调用
Close
/
Dispose
,因为在using语句中使用了
s
,该语句将关闭并处置对象。您没有使用或的原因是什么?听说过HTTP套接字重用吗?是什么让你认为返回的内容使用了默认的本地编码?你是如何测量传输速率的?您是否可以使用其他应用程序(如Chrome、Internet Explorer)从同一来源下载内容,以查看传输速度是否有相同的下降?根据您的来源,您的ISP可能正在限制带宽。如果在完全不同的网络上针对不同的源运行应用程序,会看到相同的结果吗?这个故事还有更多的内容吗(例如,您是否正在旋转执行此任务的多个线程?)?您能否告诉我有关我应该使用哪种编码的更多细节以及有关HTTP套接字重用的更多信息?我不是一个专业的程序员,所以这对我来说很重要。