很多socket程式設計的初學者可能會遇到這樣的問題:如果先ctrl+c結束伺服器端程式的話,再次啟動伺服器就會出現Address already in use這個錯誤,或者你的程式在正常關閉伺服器端socket後還是有這個問題。正如下面的這段簡單的socket程式。
server.c
client.c
在成功的運作了第一次之後,當你再次啟動伺服器端程式時,./server就變得邪惡起來,在bind()這個函數中居然出現了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 ......伺服器的程式好像突然間變乖了,呵呵,童鞋們,為自己的成就慶祝吧!!!