相关疑难解决方法(0)

如何防止插座/端口耗尽?

我试图通过跨多个线程的请求命中它来对网站进行性能测试.每个线程执行n次.(在for循环中)

但是,我遇到了问题.特别是WebException("无法连接到远程服务器")与内部异常:

无法执行套接字上的操作,因为系统缺少足够的缓冲区空间或者队列已满,因此127.0.0.1:52395

我试图在每个线程500次迭代时运行100个线程.

最初我HttpWebRequest在System.Net 中使用来向服务器发出GET请求.目前我正在使用,WebClient因为我假设每次迭代使用一个新的套接字(所以在短时间内100*500套接字).我假设WebClient(每个线程实例化一次)只会使用一个套接字.

我不需要一次打开50 000个套接字,因为我想发送GET请求,接收响应并关闭套接字,释放它以便在下一个循环迭代中使用.我明白这将是一个问题

但是,即使使用WebClient,也会请求一堆套接字,从而在TIME_WAIT模式下产生一堆套接字(使用netstat检查).这会导致其他应用程序(如Internet浏览器)挂起并停止运行.

我可以用更少的迭代和/或更少的线程来操作我的测试,因为看起来套接字最终会退出这个TIME_WAIT状态.但是,这不是一个解决方案,因为它没有充分测试Web服务器的功能.

题:

在每次线程迭代后如何显式关闭套接字(从客户端)以防止TIME_WAIT状态和套接字耗尽?

码:

包装HttpRequest的类

编辑:在使用中包装WebClient,因此为每次迭代实例化,使用和处理新的WebClient.问题仍然存在.

  public sealed class HttpGetTest : ITest {
    private readonly string m_url;

    public HttpGetTest( string url ) {          
        m_url = url;
    }

    void ITest.Execute() {
        using (WebClient webClient = new WebClient()){
            using( Stream stream = webClient.OpenRead( m_url ) ) {          
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的ThreadWrapperClass创建一个新线程的部分:

public void Execute() {
    Action Hammer = () => {
        for( int …
Run Code Online (Sandbox Code Playgroud)

c# sockets multithreading tcp

13
推荐指数
1
解决办法
2万
查看次数

GetHostEntry非常慢

我有一个WinForms应用程序,我正在尝试获取表单上显示的IP列表的反向DNS条目.

我遇到的主要问题是System.Net.Dns.GetHostEntry非常慢,特别是当没有找到反向DNS条目时.使用直接DNS,这应该很快,因为DNS服务器将返回NXDOMAIN.在内部,它调用ws2_32.dll中则getnameinfo() ,其中规定"名称解析可以通过域名系统(DNS),本地hosts文件,或通过其他命名机制" -所以我假设它的那些"其他命名机制"这导致它如此缓慢,但有谁知道这些机制是什么?

通常,每个IP需要5秒,除非它找到反向条目,然后它几乎是立即的.我使用线程部分地解决了这个问题,但由于我正在做一个大型列表而且我只能同时运行这么多线程,所以它仍然需要一段时间来完成它们.

有没有更好的方法来查找更快的反向DNS条目?

.net dns

8
推荐指数
3
解决办法
2万
查看次数

无法解析DNS(有时?)

给定一个并行请求10000个URL的同时请求100个URL的应用程序,对于其中的50-5000个,我将收到以下错误消息:

远程名称无法解析为“ www.url.com”

我了解该错误意味着DNS服务器无法解析该网址。但是,对于每次运行,无法解析的URL数量都会更改(范围从50到5000)。

我发出太多请求的速度太快了吗?而且我还能做到吗?-在功能更强大的服务器上运行相同的测试,结果表明仅10个网址无法解析-听起来更加现实。

进行并行请求的代码:

var semp = new SemaphoreSlim(100);
var uris = File.ReadAllLines(@"C:\urls.txt").Select(x => new Uri(x));

foreach(var uri in uris)
{
   Task.Run(async () =>
   {
      await semp.WaitAsync();
      var result = await Web.TryGetPage(uri); // Using HttpWebRequest
      semp.Release();
   });   
}
Run Code Online (Sandbox Code Playgroud)

c# windows dns multithreading

3
推荐指数
1
解决办法
1342
查看次数

标签 统计

c# ×2

dns ×2

multithreading ×2

.net ×1

sockets ×1

tcp ×1

windows ×1