作者mcamory (一切都是真的!!)
看板NTUIM-14
標題[網路應用與技術] PA#1 問題回應3
時間Tue Nov 14 23:08:59 2006
bind常發生的錯誤是EADDRINUSE([Address already in use]),
解決方式可在bind前加入以下兩行
int one = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
bind(listenfd, serv_addr, len) <---這邊是正常程序的bind
SO_REUSEADDR使得即使先前建立的連線仍然存在,
並且使用這個port作為listening port,而仍然能允許listen的server啟動。
這種情形常發生在以下情境:
a) server activates and listens on some port
b) a connection arrives and server fork a process to handle the connection
c) server terminates but child process is still serving the connection
d) reactivates the server
根據預設 當d發生時 server的listen的動作會重新啟動,並呼叫:socket, bind, listen
但此時bind就會出問題...因為server在嘗試bind一個現在仍屬於現存連線一部份的port,
這時候就設定socket選項為 SO_REUSEADDR就可以了。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.107.41
※ 編輯: mcamory 來自: 140.112.107.41 (11/14 23:09)