我在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。
答案 0 :(得分:2)
设置UdpClient.Ttl
属性相当于设置UdpClient.Client.Ttl
。它最终致电:
UdpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, value)
(或IPv6取决于地址系列)。
因此,我猜你必须直接致电SetSocketOption
,因为这与SocketOptionName.MulticastTimeToLive
不同。