天天看點

socket程式設計小問題:位址已經被使用——Address already in use

很多socket程式設計的初學者可能會遇到這樣的問題:如果先ctrl+c結束伺服器端程式的話,再次啟動伺服器就會出現Address already in use這個錯誤,或者你的程式在正常關閉伺服器端socket後還是有這個問題。正如下面的這段簡單的socket程式。

 server.c

client.c

 在成功的運作了第一次之後,當你再次啟動伺服器端程式時,./server就變得邪惡起來,在bind()這個函數中居然出現了Address already in use這個錯誤。

socket程式設計小問題:位址已經被使用——Address already in use

      bind 普遍遭遇的問題是試圖綁定一個已經在使用的端口。該陷阱是也許沒有活動的套接字存在,但仍然禁止綁定端口(bind 傳回 EADDRINUSE),它由 TCP 套接字狀态 TIME_WAIT 引起。該狀态在套接字關閉後約保留 2 到 4 分鐘。在 TIME_WAIT 狀态退出之後,套接字被删除,該位址才能被重新綁定而不出問題。

等待 TIME_WAIT 結束可能是令人惱火的一件事,特别是如果您正在開發一個套接字伺服器,就需要停止伺服器來做一些改動,然後重新開機。幸運的是,有方法可以避開 TIME_WAIT 狀态。可以給套接字應用 SO_REUSEADDR 套接字選項,以便端口可以馬上重用。

考慮清單 3 的例子。在綁定位址之前,我以 SO_REUSEADDR 選項調用 setsockopt。為了允許位址重用,我設定整型參數(on)為 1 (不然,可以設為 0 來禁止位址重用)。

      按照IBM的做法,我重新改寫了server.c的代碼。

server.c

這次,讓我們再次反複的啟動伺服器,盡情的在“黑窗戶”裡面輸入./server ./server ./server ......伺服器的程式好像突然間變乖了,呵呵,童鞋們,為自己的成就慶祝吧!!!

繼續閱讀