我正在使用一些传统的 TCP 服务器代码,这些代码直接与套接字一起工作,因为它是在 .NET 2.0 及更早版本中编写的。服务器具有“停止”和“开始”接受客户端连接的功能。
为了解决这个问题,我以管理员用户的身份在控制台模式下运行服务器。最重要的是,我已经从等式中消除了套接字接受线程,所有代码都类似于:
tcpListener = new TcpListener(IPAddress.Any, this.Port);
tcpListener.Start();
Run Code Online (Sandbox Code Playgroud)
和
tcpListener.Stop();
Run Code Online (Sandbox Code Playgroud)
这从不同的方法调用。我已经调试了代码,我很确定代码只执行一次。但是,问题是调用Stop实际上并没有释放套接字地址和随后的调用Start因此失败并显示错误“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”。我还可以从 ProcessExplorer 确认服务器仍在侦听服务器端口。
当我编写一个使用相同代码片段的小型控制台应用程序时,一切正常。我什至尝试跟踪 .NET 网络和套接字库,但没有错误或任何表明存在问题的内容。
我不清楚为什么调用Stop不释放套接字地址?
更新:
经过更多调查发现子进程启动到TcpListener. 我制作了一个“裸骨”示例代码来说明这个问题:
using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Threading;
namespace TcpListenerStartStop
{
class MyTcpListener
{
public static void Main(string[] args)
{
Int32 port = 13000;
if (args.Length > 0) // indicates child process
{
Thread.Sleep(4000); // as a child do nothing and wait for …Run Code Online (Sandbox Code Playgroud) 有没有办法向 NSubstitute 检查接听电话的数量是否在一定范围内?
我想做这样的事情:
myMock.Received(r => r > 1 && r <= 5).MyMethod();
Run Code Online (Sandbox Code Playgroud)
或者,如果我能获得准确的已接电话数量,也可以完成这项工作。我正在单元测试重试和超时,并且根据系统负载和其他测试运行的重试次数在单元测试执行期间可能会有所不同。
当我查看Akka.NET actor远程部署的示例时,它通过actor系统配置完成,如下所示:
actor {
provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
deployment {
/MyActor {
remote = ""akka.tcp://MyActors@127.0.0.1:8091""
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的字符串"MyActor"是实际的actor名称.我不清楚如何部署一个具有动态名称的actor(例如"MyActor:{UID}")或远程部署未知数量的actor?有没有办法通过代码动态配置部署选项?在配置中指定所有可远程部署的actor名称似乎有点乏味且非常有限.