使用TcpClient和Socket模拟慢速连接

3

我正在尝试编写一个集成测试,以证明如果连接服务器的尝试过慢,TCP客户端将正确超时。我有一个FakeServer类,它打开一个Socket并侦听传入的连接:

public sealed class FakeServer : IDisposable
{
    ...

    public TimeSpan ConnectDelay
    {
        get; set;
    }

    public void Start()
    {
        this.CreateSocket();
        this.socket.Listen(int.MaxValue);

        this.socket.BeginAccept(this.OnSocketAccepted, null);
    }

    private void CreateSocket()
    {
        var ip = new IPAddress(new byte[] { 0, 0, 0, 0 });
        var endPoint = new IPEndPoint(ip, Port);
        this.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        this.socket.Bind(endPoint);
    }

    private void OnSocketAccepted(IAsyncResult asyncResult)
    {
        Thread.Sleep(this.connectDelay);
        this.clientSocket = this.socket.EndAccept(asyncResult);
    }
}

注意我试图通过调用Thread.Sleep()来延迟连接成功的尝试。不幸的是,这并没有起作用:

[Fact]
public void tcp_client_test()
{
    this.fakeServer.ConnectDelay = TimeSpan.FromSeconds(20);
    var tcpClient = new TcpClient();
    tcpClient.Connect("localhost", FakeServer.Port);
}

在上述测试中,调用tcpClient.Connect()立即成功,甚至在服务器端的OnSocketAccepted方法被调用之前。我查看了API并没有发现任何明显的方式可以注入一些必须在客户端建立连接之前完成的服务器端逻辑。
是否有办法使用TcpClientSocket模拟一个慢速的服务器/连接呢?

2
+1 针对坏的/慢的连接进行测试,不像其他无知的人一样 :) - leppie
1
您可以使用类似NetLimiter的工具来限制连接速度。不幸的是,该工具并非免费。 - leppie
在SO/SE网络上有很多关于这个主题的问题。许多问题是特定于浏览器或特定操作系统的(至少有2个针对OS X),但是this onethis onethis one应该有你可以使用的解决方案。 - Lèse majesté
这里也有一些通用的解决方案:http://webmasters.stackexchange.com/questions/861/how-can-i-simulate-a-slow-connection-for-page-load - Lèse majesté
@Lese:这是可能的。问题是,我试图保持我的测试简单和易懂。引入这样的依赖将使它们更难以阅读和维护。在我看来,应该可以在没有外部工具的情况下轻松完成,但也许不行。 - Kent Boogaart
显示剩余5条评论
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接