2012-02-07 18 views
5

Nếu tôi làm điều gì đó như thế này:Unsureness về đi EndPoint để Socket.ReceiveFrom()

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); 

sẽ phương pháp ReceiveFrom chỉ nhận được gói tin từ các thiết bị đầu cuối đang được thông qua? Tài liệu nêu rõ các điều sau:

Với giao thức không kết nối, ReceiveFrom sẽ đọc dữ liệu đầu tiên nạp vào bộ đệm mạng cục bộ.

Điều đó có nghĩa là EndPoint đã qua chỉ được sử dụng để lưu trữ EndPoint của máy chủ mà gói tin đến và không ảnh hưởng đến hành vi của phương thức ReceiveFrom? Nếu vậy, tại sao nó cần phải được thông qua như là "ref" thay vì "ra"?

+0

Sau khi thực hiện một số thử nghiệm, tôi đã tìm ra rằng giá trị của điểm kết thúc đã qua không quan trọng. Nó chỉ được sử dụng để lưu trữ. Nhưng tôi vẫn không biết tại sao nó phải được thông qua như là tham chiếu sau đó. – haiyyu

+0

Không phải EndPoint là một cấu trúc? – Joshua

+0

Vâng, bạn nói đúng. Mặc dù điều đó không nên tạo sự khác biệt trong trường hợp của tôi. – haiyyu

Trả lời

1

Lưu ý rằng phương pháp ReceiveFrom là trình bao bọc được quản lý cho hàm recvfrom WinSock. Hàm này lấy một con trỏ tới cấu trúc sockaddr là tùy chọn và được phân bổ/deallocated ở phía người gọi.

Với ý nghĩ đó tôi có một vài lý thuyết tại sao là EndPoint truyền như ref và không out:

  1. lẽ cho phù hợp với WinSock hoạt các EndPoint được phân bổ bởi người gọi và do đó đi ngang qua ref.
  2. Có thể EndPoint có lúc được coi là tham số tùy chọn, nhưng điều này chưa bao giờ được triển khai (tôi đã kiểm tra, nó phải là không null).
  3. Có thể đối với một số giao thức có hướng xử lý được chuyển qua tham số EndPoint. Có thể ngay cả các giao thức trong tương lai :-)
Các vấn đề liên quan