看板 NTUIM-14 關於我們 聯絡資訊
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)