1. 程式人生 > >socket為什麼無法繫結?

socket為什麼無法繫結?

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的建立沒有關係,主要是由於沒有正確關閉的緣故,其實也算不上是沒有正常關閉,主要是由於使用了靜態變數,改回來就沒有問題了,我想大致原因是由於在服務中使用靜態變數。

還有一個原因:

那就是,該程式綁定了該埠之後,程式就退出了。但是該埠給該程式的子程式給繼承下來綁定了,所以導致下一次該程式繼續繫結的時候失敗。解決辦法:在該程式結束的時候,同時結束掉他的子程式,這樣就可以避免該埠的繫結。