socket為什麼無法繫結?
阿新 • • 發佈:2019-01-02
Q:我繫結socket的時候總是失敗,只有開機第一次執行程式的時候可以繫結,然後以後就不行了,當我使用另外一個程式連線此埠的時候卻連不上,但是我用埠掃描軟體卻可以掃到這個埠,請問大俠是什麼原因?如何解決?謝謝了先。
A:1.先確定該socket正常關閉
2.如果一個socket綁定了某個埠,該socket正常關閉或程式退出後,在一段時間內該埠依然保持被繫結的狀態,其他程式(或者重新啟動的原程式)無法繫結該埠。可以在獲得socket描述符之後通過呼叫setsockopt語句避免該問題:
int sockfd;
int opt = 1;
int len = sizeof(opt);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, &len);
Q:原因查出來了,與socket的建立沒有關係,主要是由於沒有正確關閉的緣故,其實也算不上是沒有正常關閉,主要是由於使用了靜態變數,改回來就沒有問題了,我想大致原因是由於在服務中使用靜態變數。
還有一個原因:
那就是,該程式綁定了該埠之後,程式就退出了。但是該埠給該程式的子程式給繼承下來綁定了,所以導致下一次該程式繼續繫結的時候失敗。解決辦法:在該程式結束的時候,同時結束掉他的子程式,這樣就可以避免該埠的繫結。