伪造与TcpClient和套接字的缓慢连接
问题描述:
我正在尝试编写集成测试以证明如果尝试连接到服务器的速度太慢,TCP客户端将正确超时。我有一个打开Socket
并监听传入连接FakeServer
类:伪造与TcpClient和套接字的缓慢连接
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,看不到任何明显的方式让我注入一些服务器端逻辑,这些逻辑必须在客户端连接建立之前完成。
有没有什么办法让我伪造一个使用TcpClient
和Socket
的缓慢服务器/连接?
+1的实际测试坏/慢速连接不像无知的世界其他地方:) – leppie 2012-07-16 09:21:44
你可以使用像NetLimiter工具来节流的连接。不幸的是不自由。 – leppie 2012-07-16 09:22:53
有关SO/SE网络的相关问题涉及此主题。许多是特定于浏览器或特定的操作系统(OS X至少有2个),但[这一个](http://stackoverflow.com/questions/1094760/network-tools-that-simulate-slow-network-连接),[这一个](http://stackoverflow.com/questions/11488888/simulate-slow-internet-connection-on-a-real-device)和[this one](http://superuser.com/questions/297103/how-to-simulate-slow-internet-connection)应该有可能使用的解决方案。 – 2012-07-16 09:37:59