我已經在C++中廣泛地使用了套接字編程,所以我明白了所有的套接字選項,等等。現在我涉及C#,並且遇到了一個問題,我想解釋一下。C#UdpClient -Ttl屬性與SetSocketOption
我在另一個開發人員開始的小應用程序中使用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。
您可能比我更瞭解網絡,但在反射器中查看組件時發現,設置UdpClient.Ttl(與設置UdpClient.Client.Ttl相同)最終調用SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress,(int)value);現在我不知道這是什麼意思,但對我來說,似乎與TTL沒有任何關係?還是呢? – DeCaf
傻我,看來SocketOptionName.ReuseAddress是相同的SocketOptionName.IpTimeToLive(都有值4),所以我想它是有關TTL。 – DeCaf
我想我不明白你在說什麼。 ReuseAddress與TTL是不同的設置,那麼當您設置TTL屬性時,您是否說MS代碼錯誤地調用了ReuseAddress?對不起,答案延遲了。 – JPhi1618