前用Python寫了個簡單的TCP通信程序,放在騰訊雲上24小時運行。不過有個問題,有時候使用kill -9 pid
命令結束掉python進程后,再次運行程序就會提示Address already in use
這個錯誤,然而等一段時間再去運行就可以了。
造成這個問題的原因在於此時TCP連接還沒有完全關閉,而Socket默認不支持地址復用。深入的原因打算等之后仔細學習TCP/IP協議的時候再來研究,目前只是要找一個解決方案。
找到的解決方案也很簡單,在綁定前調用setsockopt()
函數讓Socket允許地址復用即可,即以下代碼:
1 |
MySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
第2行代碼就是調用setsockopt()
函數,其中SOL_SOCKET
代表對Socket層進行設置,SO_REUSEADDR
代表是否允許在bind過程中本地地址可重復使用,最后的1
表示允許。