Я думаю, что вы правы, говоря: «сервер не должен знать». Если вы отправляете UDP-пакет на какой-либо IP / порт, который может быть или не быть открытым, у сервера нет способа узнать, достиг ли он своего пункта назначения.
Единственный способ узнать это - заставить клиента отправить ACK обратно. (Кроме того, и клиент, и сервер должны иметь механизмы повторной отправки на случай потери пакетов).
Так что явно что-то еще происходит в вашем коде (или с реализацией .Net udp)
EDIT:
После замечания Николая я проверил документы. И действительно, в .Net существует различие между «подключением» или «отсутствием соединения» при использовании UDP.
Если вы используете такой код:
UdpClient udpClient = new UdpClient(11000); //sourceport
try{
udpClient.Connect("www.contoso.com", 11000); //'connect' to destmachine and port
// Sends a message to the host to which you have connected.
Byte[] sendBytes = Encoding.ASCII.GetBytes("Is anybody there?");
udpClient.Send(sendBytes, sendBytes.Length);
тогда, по-видимому, вы «связаны»
Однако, если вы используете такой код:
UdpClient udpClientB = new UdpClient();
udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);
затем вы можете отправить кому угодно без «подключения».
Я не уверен, как выглядит ваш код, но, возможно, стоит проверить, используете ли вы правильный набор команд, который не предполагает «соединение»