我正在編寫一個C應用程序,它在啓動時作爲systemd service運行,並且應該連接到服務器。因爲應用程序在啓動時運行,所以最終會發生網絡連接尚未建立。這自然會導致第一個功能失敗,這需要一個,在我的情況下是getaddrinfo
。如果getaddrinfo一旦失敗(即使在網絡準備就緒後)失敗
所以我想我只會寫一個循環,它會反覆調用getaddrinfo
,直到網絡準備好後纔會結束。不幸的是,我發現getaddrinfo
即使在連接建立之後仍然與name or service not known
一起失敗。
我能夠通過主機名ping服務器,但getaddrinfo
仍然不會這樣做。如果我停止應用程序並再次運行它,一切正常。如果網絡連接在第一次通話之前已經建立,則getaddrinfo
也可以正常工作。
顯然,如果getaddrinfo
因爲網絡未準備好而失敗一次,它將永遠失敗。似乎沒有意識到現有的連接。在使用已棄用的gethostbyname
時,行爲是相同的。
這種行爲的原因是什麼?有沒有辦法強制getaddrinfo
刷新內部變量(如果存在的話)或類似的東西,這可能解釋爲什麼該函數仍然認爲沒有連接?是否還有另一個功能,我應該先調用以檢查網絡是否準備就緒?
我想避免延遲等待一段時間,期待網絡連接後。我也希望檢查從我的應用程序中的連接,並沒有一個bash腳本首先檢查它,然後啓動應用程序。
由此,我的意思是res_init()在循環內。 –
這實際上有時(但很少)有效。我假設它在網絡連接已經建立的情況下工作,但是當應用程序啓動時'resolv.conf'尚未更新。一旦'resolv.conf'被更新,在循環中對'res_init'的調用加載新的配置,然後'getaddrinfo'結束。 但是,如果網絡連接在應用程序啓動時尚未準備好,它仍然保持失敗, – kassiopeia
我的分步演示涉及在完全沒有配置DNS解析時啓動應用程序,這種情況在沒有網絡連接時就會出現。您是否嘗試在沒有網絡連接的情況下調用rs_init()來啓動演示代碼,然後連接到網絡?這個簡短的小演示代碼很容易測試。沒有必要承擔任何事情。 –