2010-10-25 45 views
0

我正在嘗試改造API以與IPv4兼容。基本上,API在一個階段創建一個套接字,然後調用bind()打開一個端口進行監聽。通過傳遞由getaddrinfo()返回的sockaddr來指定端口,並指定服務參數中的端口。稍後,調用者可以選擇分配多播組,調用一個在套接字上設置IP_ADD_MEMBERSHIP的API函數。有沒有辦法在綁定後更改套接字的家族? (與IPv6有關的問題)

問題在於,對於IPv6(即,家庭提示getaddrinfo是AF_UNSPEC而不是AF_INET,因爲它以前是),當用戶請求IPv4多播組時,IP_ADD_MEMBERSHIP會失敗。這是因爲當沒有提示提示時,系統顯然默認提供IPv6地址。

解決方案顯然是提前知道用戶是否想要指定IPv4或IPv6多播組。但是,因爲我不想改變API本身,所以這些信息僅僅被認爲是未知的。

我還有其他的選擇嗎?

我試圖在IP_ADD_MEMBERSHIP之前關閉,重新創建和重新綁定套接字,但由於某種原因,我的第二個bind()失敗。 (我試過指定SO_REUSEADDR,但這沒有幫助。)

有什麼方法可以簡單地「解除綁定」套接字並將其重新綁定到新家族?或者只是改變家庭,期限?

回答

1

不可能。通常的kludgey解決方案是保留兩個插座,一個用於AF_INET,另一個用於AF_INET6

相關問題