我创建了一个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 :(得分:4)
所以我将应用程序增强到绑定到端口0(零),以便它可以接受任何可用端口上的请求。
错误。 0表示操作系统应分配端口。服务器一次只能侦听一个端口。 listen套接字只接受新连接。
新连接将具有相同的本地端口,但使用IP标头中的源(ip /端口)和目标(ip /端口)的 组合 识别 连接 。这就是为什么相同的侦听套接字可以接受多个客户端。
UDP支持广播,如果这是你正在寻找的。 p>
<强>更新强>
一个非常简化的例子
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)来避免阻塞。