學習筆記 socket關於埠重用的學習

2021-06-22 00:51:57 字數 1263 閱讀 8873

這兩天想搭建乙個c2c伺服器的模型,一開始是想用c寫,結果c的各種細節寫的人太煩躁了,就換成了python,原來n百行的**瞬間變成了幾十行,世界一下子就清淨了~這是後話,此文主要是記錄一下埠重用的問題。

之前寫socket經常在除錯時候,每次重啟服務端都會在bind時候報錯 :[埠被占用] ,這是因為bind試圖繫結乙個已經在使用的埠。而這個埠被占用的原因是上次退出之後核心對該埠會儲存一段時間。

【bind 普遍遭遇的問題是試圖繫結乙個已經在使用的埠。該隱患是也許沒有活動的套接字存在,

但仍然禁止繫結埠(bind 返回 eaddrinuse),

它由 tcp 套接字狀態 time_wait 引起。

該狀態在套接字關閉後約保留 2個msl時長(rfc793定義了msl為2分鐘,linux設定成了30s)。在 time_wait 狀態退出之後,套接字被刪除,

該位址才能被重新

繫結而不出問題。——

tcp埠重用】

原先的解決辦法是ps -aux|grep ***出程序號然後kill掉(錯誤),但是現在因為要寫的是乙個伺服器,所以這個辦法肯定是不能再用了。中午問歡神得到解決辦法:使用埠重用。

什麼是埠重用...?簡單來說就是,使乙個正在被使用(或者處於time_wait狀態)的埠立刻可以被新的bind函式繫結。

使用到的函式是setsockopt(),關鍵字是so_reuseaddr。其函式

在python中該函式是描述符的乙個方法。

在socket函式之後,設定setsockopt函式。

例:

tcp_server = socket(af_inet, sock_stream)	

tcp_server.setsockopt(sol_socket, so_reuseaddr, 1) #設定埠重用

tcp_server.bind(addr)

現在就會發現,重啟服務之後不會在有之前的 [埠被占用] 錯誤出現了。

備註:此辦法僅限於規避當前服務的關閉後重啟出現的埠占用問題,而不是啟動多個相同的服務。

python使用setsockopt獲得埠重用 :

setsockopt常用的其他引數:www.cnblogs.com/xiaowuyi/archive/2012/08/06/2625509.html

python實現socket埠重定向示例

可以很輕鬆的在埠12345開啟共享,效果如下 要實現我想要的功能,只需要將埠重定向就行了,如下 複製 如下 usr bin python file n程式設計客棧bsp redirect.py author mike import socket,os buflen 4 1024 sock1 sock...

socket位址和埠重用(造成bind出錯)

其實這個問題在richard stevens的 unix網路程式設計指南 卷一里有很詳細的 解答 中文版p166 168頁 這裡我只是寫幾個基本的例子來驗證這個問題。首先宣告乙個問題 當兩個socket的address和port相衝突,而你又想重用地 址和埠,則舊的socket和新的socket都要...

關於Socket監聽服務埠應用

socket監聽服務埠應用,實時監聽,希望有大牛指出不足,上 伺服器啟動監聽類 守護執行緒 public class startthread extends thread catch ioexception e 守護執行緒子執行緒 public class zithread implements r...