2012-12-03 48 views
2

Ubuntu Linux操作系統,內核2.6.32-45,64B,Perl的5.10.1Perl的IO ::插座:: UNIX連接帶超時給人EAGAIN/EWOULDBLOCK

我連接了許多新的IO ::插座:: UNIX流套接字到服務器,並且大多數他們工作得很好。但是有時在一個速度更快的處理器上的線程嚴重的環境中,它們會返回「資源暫時不可用」(EAGAIN/EWOULDBLOCK)。我在Connect上使用超時,所以這會導致套接字在連接期間進入非阻塞模式。但我的超時時間沒有發生 - 它不會等待任何明顯的時間,它會很快返回。

我看到,在IO :: Socket內部,它會嘗試連接,並且如果使用EINPROGRESS或EAGAIN/EWOULDBLOCK失敗,它會執行一個select來等待寫入位被設置。到目前爲止這似乎很正常。在我的情況下,選擇快速成功,意味着寫入位被設置,然後代碼嘗試重新連接。 (我想這是試圖通過錯誤滑動來獲取任何錯誤?)無論如何,重新連接再次失敗與EAGAIN/EWOULDBLOCK。

在我的代碼中,這很容易通過重試循環來修復。但我不明白爲什麼,當套接字變爲可寫時,套接字不可重新連接。我認爲選擇後衛對於非阻塞連接來說總是足夠的。顯然不是;所以我的問題是:

  • 什麼情況導致連接失敗時選擇工作(寫位設置)?
  • 有沒有比旋轉和重試更好的方法,等待連接成功?紡紗浪費週期。相反,我希望它阻止像select/poll之類的東西,但我仍然需要超時。

感謝名單,

- 史蒂夫

回答

0

但我不明白爲什麼,當套接字變爲可寫的,在插槽中不會重新連接。

我想這是因爲任何需要的資源變得自由了,在你能夠再次連接之前就被搶走了。用旋轉環代替select不會有幫助。

+0

呃! Thanx,你把燈泡放在我的腦海裏。我(錯誤地)認爲第一個連接已經導致任何資源被分配並保持爲套接字分配。我看到現在我錯了 - EAGAIN(E-anything)狀態意味着第一個連接完成並失敗;第二個連接是與第一個完全不同的全新連接。感謝名單! – user1873301