远程主机在接收时强行关闭了连接
Connection was forcibly closed by the remote host on receive
您好,我想了解为什么会出现此异常:
Message: System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host
我正在使用 NUnit 执行单元测试,并且我对所有测试使用相同的 redis-server 实例(托管在本地)。
第一个单元测试集非常有效 - 我可以从 Redis 服务器发送和接收数据。
在第二次测试中我可以发送但在接收时我得到异常 thrown.Do 我必须在测试之间关闭套接字(假设它在测试范围之外时没有被处理)或者有什么我必须知道什么时候从一个单元测试切换到另一个?
有效的测试
class RedisTests
{
[TestCase("*2\r\n\r\nget\r\n\r\na\r\n","\r\n3\r\n")]
[TestCase("*3\r\n\r\nset\r\n\r\na\r\n\r\n3\r\n", "+OK\r\n",Description ="Cmd:Set a 3 Result: +OK\r\n")]
public async Task RedisSetTest(string command, string expectedResult)
{
Socket socket = TConstants.MakeSocket();
IPEndPoint redisPoint = TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS,TConstants.REDIS_PORT);
await socket.ConnectAsync(redisPoint);
Provider provider = Provider.Create(socket, 30);
await socket.SendAsync(TConstants.UTF8Encode(command), SocketFlags.None);
try
{
SmartMemory memory = await provider.ReceiveAsync();
var payload = Extensions.Map(x => (char)x,
memory.Iterator.Slice(0, memory.Message.Length).ToEnumerable()
);
string result = string.Concat(payload);
Assert.AreEqual(expectedResult, result);
}
catch (Exception exception)
{
Debug.WriteLine(exception.Message);
throw;
}
}
}
P.S Provider's
方法 ReceiveAsync
只是一个包装器,并以相同的方式在其核心执行 Socket.ReceiveAsync
.
抛出异常的测试
class STMTests
{
[TestCase(2)]
public async Task FillIntegerNode(int value)
{
Socket socket = TConstants.MakeSocket();
IPEndPoint redisPoint=TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS, TConstants.REDIS_PORT);
//port = 6379
//address="127.0.0.1"
await socket.ConnectAsync(redisPoint);
Memory<byte>data=BitConverter.GetBytes(injectableNode.Value);
int sent=await socket.SendAsync(data, SocketFlags.None);
Memory<byte> dt = new byte[33];
var mem = await socket.ReceiveAsync(dt, SocketFlags.None);
Assert.IsTrue(true);
}
}
我添加了一张带有测试层次结构的图片:
一般规则是,如果您创造了一次性的东西,那么您就是负责处理它的人。在这种情况下,您将在每个测试中创建套接字,就在测试方法本身中。所以你必须在测试方法中或在TearDown
中处理它,即在每个测试方法之后立即运行。
通常,处理在测试中创建的东西的最简单方法是通过 using
。
OTOH,如果你想让测试夹具 class 中的所有方法使用同一个套接字,你应该在 OneTimeSetUp
方法中打开它并在 OneTimeTearDown
中处理它.
您好,我想了解为什么会出现此异常:
Message: System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host
我正在使用 NUnit 执行单元测试,并且我对所有测试使用相同的 redis-server 实例(托管在本地)。
第一个单元测试集非常有效 - 我可以从 Redis 服务器发送和接收数据。 在第二次测试中我可以发送但在接收时我得到异常 thrown.Do 我必须在测试之间关闭套接字(假设它在测试范围之外时没有被处理)或者有什么我必须知道什么时候从一个单元测试切换到另一个?
有效的测试
class RedisTests
{
[TestCase("*2\r\n\r\nget\r\n\r\na\r\n","\r\n3\r\n")]
[TestCase("*3\r\n\r\nset\r\n\r\na\r\n\r\n3\r\n", "+OK\r\n",Description ="Cmd:Set a 3 Result: +OK\r\n")]
public async Task RedisSetTest(string command, string expectedResult)
{
Socket socket = TConstants.MakeSocket();
IPEndPoint redisPoint = TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS,TConstants.REDIS_PORT);
await socket.ConnectAsync(redisPoint);
Provider provider = Provider.Create(socket, 30);
await socket.SendAsync(TConstants.UTF8Encode(command), SocketFlags.None);
try
{
SmartMemory memory = await provider.ReceiveAsync();
var payload = Extensions.Map(x => (char)x,
memory.Iterator.Slice(0, memory.Message.Length).ToEnumerable()
);
string result = string.Concat(payload);
Assert.AreEqual(expectedResult, result);
}
catch (Exception exception)
{
Debug.WriteLine(exception.Message);
throw;
}
}
}
P.S Provider's
方法 ReceiveAsync
只是一个包装器,并以相同的方式在其核心执行 Socket.ReceiveAsync
.
抛出异常的测试
class STMTests
{
[TestCase(2)]
public async Task FillIntegerNode(int value)
{
Socket socket = TConstants.MakeSocket();
IPEndPoint redisPoint=TConstants.MakeEndpoint(TConstants.DEFAULT_ADDRESS, TConstants.REDIS_PORT);
//port = 6379
//address="127.0.0.1"
await socket.ConnectAsync(redisPoint);
Memory<byte>data=BitConverter.GetBytes(injectableNode.Value);
int sent=await socket.SendAsync(data, SocketFlags.None);
Memory<byte> dt = new byte[33];
var mem = await socket.ReceiveAsync(dt, SocketFlags.None);
Assert.IsTrue(true);
}
}
我添加了一张带有测试层次结构的图片:
一般规则是,如果您创造了一次性的东西,那么您就是负责处理它的人。在这种情况下,您将在每个测试中创建套接字,就在测试方法本身中。所以你必须在测试方法中或在TearDown
中处理它,即在每个测试方法之后立即运行。
通常,处理在测试中创建的东西的最简单方法是通过 using
。
OTOH,如果你想让测试夹具 class 中的所有方法使用同一个套接字,你应该在 OneTimeSetUp
方法中打开它并在 OneTimeTearDown
中处理它.