2010-07-02 102 views
1

winsock函數套接字期望作爲協議的第三個參數,對於套接字類型SOCK_STREAM,通常是IPROTO_TCP,對於套接字類型SOCK_DGRAM,IPROTO_UDP通常是IPROTO_TCP。當我傳遞0值作爲協議參數時,TCP和UDP按預期工作。winsock套接字函數中的協議參數是什麼?

SOCKET s = socket(AF_INET, SOCK_DGRAM, 0) 

    // s is a valid socket 

什麼是IPROTO_IP協議參數值意味着什麼?如果它只是用於SOCK_RAW,爲什麼會有這種冗餘?

socket(AF_INET, SOCK_STREAM, IPROTO_TCP); 
socket(AF_INET, SOCK_DGRAM, IPROTO_UDP); 

實際上協議參數指定了什麼?當我可以使用另一個值時,它看起來不重要。

我想從帶有多個網絡卡的PC發送UDP數據包(包括廣播)到特定的以太網段。雖然IP路由通常選擇網卡(和源地址),但我想指定適配器並考慮原始套接字或任何其他方式來實現此目標。在這種情況下,IPPROTO_IP可能會有所幫助。

回答

1

我認爲socket的文檔(可以在這裏找到:http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx)很清楚它的價值是什麼以及爲什麼如果你不關心傳遞0是很好的。

如果您想爲不常見的連接類型設置套接字,您可能想要傳遞不同的情況:如藍牙,或者如果你想創建一個PGM可靠的多播套接字等。

你的第二個問題與原始套接字或協議參數無關。你需要做的只是將你的套接字綁定到你想要使用的本地接口的地址;所以不要綁定到INADDR_ANY並允許棧決定你,而是告訴它使用哪個接口。