Ответ 1
Я думаю, вы правы, говоря: "сервер не должен знать". Если вы отправляете 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);
то вы можете отправить кому угодно, не подключаясь.
Я не уверен, как выглядит ваш код, но, возможно, стоит проверить, используете ли вы правильный набор команд, которые не предполагают "соединение"