C#UdpClient - Ttl属性与SetSocketOption

时间:2011-08-29 20:08:40

标签: c# udp multicast

我在C ++中广泛使用套接字编程,所以我理解所有套接字选项是什么,等等。现在我正在涉及C#,我遇到了一个我想要解释的问题。

我在另一个开发人员启动的小应用程序中使用UdpClient类。我正在向多播地址发送数据包,因此我需要为数据包设置TTL。我在这里查看文档:

http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx

还有一个可以设置或获取的TTL属性。该属性的帮助说“默认”ttl是128.如果我得到属性,它是128,并且在我设置属性并再次获取它之后,我可以验证值已经改变,但是,当我发送一个数据包,其实际TTL设置为1。

因为我对启动应用程序的人更了解网络,所以我尝试了这行代码(udpRecvClient是UdpClient的名称):

updRecvClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 64);

这会导致我发送的数据包的正确TTL为64,但读取Ttl属性仍然会返回未更改的默认值128.

那是什么给出的?我是否误读了Ttl财产?我想知道问题是什么,所以我可以尝试在使用其他C#类时避免它。现在,我只是将SetSocketOption用于所有内容,而忽略了“有用的”属性。

请注意,updRecvClient.Client.Ttl也是一个属性,它也不会更改传出数据包的实际TTL。

1 个答案:

答案 0 :(得分:2)

设置UdpClient.Ttl属性相当于设置UdpClient.Client.Ttl。它最终致电:

 UdpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, value)

(或IPv6取决于地址系列)。

因此,我猜你必须直接致电SetSocketOption,因为这与SocketOptionName.MulticastTimeToLive不同。