2011-08-29 98 views
3

我已經在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。

+0

您可能比我更瞭解網絡,但在反射器中查看組件時發現,設置UdpClient.Ttl(與設置UdpClient.Client.Ttl相同)最終調用SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress,(int)value);現在我不知道這是什麼意思,但對我來說,似乎與TTL沒有任何關係?還是呢? – DeCaf

+0

傻我,看來SocketOptionName.ReuseAddress是相同的SocketOptionName.IpTimeToLive(都有值4),所以我想它是有關TTL。 – DeCaf

+0

我想我不明白你在說什麼。 ReuseAddress與TTL是不同的設置,那麼當您設置TTL屬性時,您是否說MS代碼錯誤地調用了ReuseAddress?對不起,答案延遲了。 – JPhi1618

回答

2

設置UdpClient.Ttl屬性等同於設置UdpClient.Client.Ttl。它結束呼叫:

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

(或IPv6取決於地址系列)。

所以我猜你必須直接撥打SetSocketOption如果你想設置SocketOptionName.MulticastTimeToLive,因爲這不同於SocketOptionName.IpTimeToLive

+0

TTL屬性是否調用ReuseAddress,或者它是否調用此IpTimeToLive?我沒有意識到有兩次存活值,所以我不確定IpTimeToLive和MulticastTimeToLive之間有什麼區別,除非IPv6有差別。 – JPhi1618

+0

ReuseAddress的枚舉值與IpTimeToLive相同,這意味着被調用的方法不能足夠有趣地區分它們。區別在於IpTimeToLive選項是影響SocketOptionLevel.IP的選項,如果您要設置ReuseAddress,則必須指定SocketOptionLevel.Socket。 – DeCaf

+0

有關MulticastTimeToLive和IpTimeToLive選項之間差異的一些信息,請參閱http://social.msdn.microsoft.com/Forums/ar/netfxnetcom/thread/a0215b38-a15e-400b-91c1-fda5d448dc61。 – DeCaf