Неопределенность в отношении передачи EndPoint в Socket.ReceiveFrom () - PullRequest
5 голосов
/ 07 февраля 2012

Если я сделаю что-то вроде этого:

byte[] buffer = new byte[1024];
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse("12.34.56.78"), 1337);
sock.ReceiveFrom(buffer, ref remote);

Будет ли метод ReceiveFrom получать пакеты только от переданной конечной точки?В документации говорится следующее:

При использовании протоколов без установления соединения ReceiveFrom будет считывать первую поставленную в очередь дейтаграмму, полученную в буфер локальной сети.

Означает ли это, что переданная конечная точкаиспользуется только для хранения конечной точки хоста, с которого пришел пакет, и не влияет на поведение метода ReceiveFrom вообще?Если это так, почему его нужно передавать как «ref» вместо «out»?

1 Ответ

1 голос
/ 08 февраля 2012

Обратите внимание, что метод ReceiveFrom является управляемой оболочкой для recvfrom WinSock. Эта функция принимает указатель на структуру sockaddr, которая является необязательной и выделяется / освобождается на стороне вызывающей стороны.

Имея это в виду, у меня есть несколько теорий, почему EndPoint передается как ref, а не out:

  1. Возможно, для согласованности с функцией WinSock, EndPoint выделяется вызывающей стороной и поэтому передается ref.
  2. Может быть, EndPoint в какой-то момент считался необязательным параметром, но он никогда не был реализован (я проверял, он должен быть ненулевым).
  3. Может быть, для некоторых протоколов есть направления обработки, передаваемые через параметр EndPoint. Может быть, даже будущие протоколы: -)
...