我有一個音頻流應用程式,它使用系結到埠 50050 的 boost UDP 套接字。當應用程式在流式傳輸時關閉時,我目前遇到問題。重新啟動應用程式時,它無法再系結到埠 50050。我做了一個“netstat -p UDP”,它顯示了以下內容
Proto Recv-Q Send-Q 本地地址 外部地址(狀態)
udp4 1026 0 *.50050 。
所以,基本上這個socket的接收佇列不是空的,之前系結的埠確實仍然是活動的。
現在我想知道 a) 是否有辦法強制系結到埠 50050 或 b) 可以清除套接字接收佇列或 c) 可以重用現有套接字或 d) 如果您有其他建議如何解決該問題?
提前謝謝,最好的
亞歷克斯
uj5u.com熱心網友回復:
與 TCP 不同,一旦應用程式關閉套接字,UDP 套接字就不會在某個臨時狀態下徘徊。因此,您所看到的意味著仍然有一個行程擁有一個系結到該埠的套接字。這表明應用程式沒有完全關閉,但至少有一個執行緒仍在運行。或者它可能是繼承了套接字的分叉子節點。
雖然您可以使用 SO_REUSEADDR 創建一個額外的套接字(有關詳細資訊,請參閱其他評論和答案),但這不會使現有的套接字無效。發送到此埠的資料將僅在現有套接字之一結束,并且不會傳播到所有套接字。這可能會導致資料丟失。
uj5u.com熱心網友回復:
在呼叫之前在套接字上設定 SO_REUSEADDR 屬性bind。
int fAllow = 1;
int result;
result = ::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &fAllow, sizeof(fAllow));
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/416589.html
標籤:
