我创建了一个Windows服务套接字程序来侦听特定端口并接受客户端请求。效果很好。
protected override void OnStart(string[] args)
{
//Lisetns only on port 8030
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8030);
//Defines the kind of socket we want :TCP
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Bind the socket to the local end point(associate the socket to localendpoint)
serverSocket.Bind(ipEndPoint);
//listen for incoming connection attempt
// Start listening, only allow 10 connection to queue at the same time
serverSocket.Listen(10);
Socket handler = serverSocket.Accept();
}
但是我需要服务程序侦听多个端口并接受任何可用端口上的客户端请求。
因此我增强了应用程序以绑定到端口 0(零),以便它可以接受任何可用端口上的请求。
但是后来我得到了错误
10061
No connection could be made because the target machine actively refused it.
我无法知道出现此错误的原因是什么。
任何人都可以建议增强代码以接受任何端口上的请求的方法吗?
但是客户端需要发送请求来连接到特定端口。例如,client1 应连接到
port 8030
,client2 应连接到 port 8031
。
因此我增强了应用程序以绑定到端口 0(零),以便它可以接受任何可用端口上的请求。
错了! 0 表示操作系统应分配一个端口。服务器一次只能侦听“一个”端口。监听套接字只接受新连接。 新连接将具有相同的本地端口,但 IP 标头中源(ip/端口)和目标(ip/端口)的
组合用于标识连接。这就是为什么同一个监听套接字可以接受多个客户端。 UDP 支持广播,如果您正在寻找的话。
更新:一个非常简单的例子:
Socket client1 = serverSocket.Accept(); // blocks until one connects
Socket client2 = serverSocket.Accept(); // same here
var buffer = Encoding.ASCII.GetBytes("Hello, World!");
client1.Send(buffer, 0, buffer.Count); //sending to client 1
client2.Send(buffer, 0, buffer.Count); //sending to client 2
只需为您想要接受的每个客户继续致电
Accept
。我通常使用异步方法(Begin/EndXXX)来避免阻塞。