socket 端口和地址復用

https://blog.csdn.net/weibo1230123/article/details/79978745

https://blog.csdn.net/weixin_42157432/article/details/115560824

在linux socket網絡編程中,大規模并發TCP或UDP連接時,經常會用到端口復用:

int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const void *) &opt, sizeof(opt))) {perror("setsockopt");return -1;
}

端口復用可以這樣理解:

在A機進行客戶端網絡編程,假如它使用的本地端口號為1234,如果沒有開啟端口復用的話,它用本地端口1234去連接B機再用本地端口連接C機時就不可以了。

若開啟了端口復用的話在本地端口1234訪問B機的情況下還可以用本地端口1234訪問C機。

如果是服務器程序中監聽的端口,即使開啟了復用,也不可以用該端口向外發起連接。

接下來看看setsockopt函數的參數意義:

/* Set socket FD's option OPTNAME at protocol level LEVELto *OPTVAL (which is OPTLEN bytes long).Returns 0 on success, -1 for errors.  */
extern int setsockopt (int __fd, int __level, int __optname,const void *__optval, socklen_t __optlen) __THROW;

__optname常見的有兩個:

SO_REUSEADDR:地址復用

SO_REUSEPORT:端口復用

一般來說,一個{addr,port}只能被一個套接字綁定,無法重用。

不同的套接字只能綁定到不同的的{addr,port}

SO_REUSEADDR 和 SO_REUSEPORT

SO_REUSEADDR提供如下四個功能:

SO_REUSEADDR允許啟動一個監聽服務器并捆綁其眾所周知端口,即使以前建立的將此端口用做他們的本地端口的連接仍存在。這通常是重啟監聽服務器時出現,若不設置此選項,則bind時將出錯。SO_REUSEADDR允許在同一端口上啟動同一服務器的多個實例,只要每個實例捆綁一個不同的本地IP地址即可。對于TCP,我們根本不可能啟動捆綁相同IP地址和相同端口號的多個服務器。SO_REUSEADDR允許單個進程捆綁同一端口到多個套接口上,只要每個捆綁指定不同的本地IP地址即可。這一般不用于TCP服務器。SO_REUSEADDR允許完全重復的捆綁:當一個IP地址和端口綁定到某個套接口上時,還允許此IP地址和端口捆綁到另一個套接口上。一般來說,這個特性僅在支持多播的系統上才有,而且只對UDP套接口而言(TCP不支持多播)。

SO_REUSEPORT選項有如下語義:

此選項允許完全重復捆綁,但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項才行。如果被捆綁的IP地址是一個多播地址,則SO_REUSEADDR和SO_REUSEPORT等效。

使用這兩個套接口選項的建議:

在所有TCP服務器中,在調用bind之前設置SO_REUSEADDR套接口選項;

功能如下:

  • 若監聽服務器進入TIME_WAIT狀態,可立即重啟
  • 同一端口啟動同一服務器的多個實例,需要每個實例socket綁定不同的ip地址,一般需要多個網卡支持
  • 支持完全重復的捆綁

當一個IP地址和端口綁定到某個socket上,還允許此IP地址和端口號捆綁到另一個socket上。

一般來說,這個特性僅在支持多播的系統上才有用,而且只針對UDPsocket,TCP不支持多播

對于監聽線程來說,可重用socket被稱為監聽桶(listener bucket),即每一個socket都是一個桶。以event模型為例,假設目前有3個子進程,嗎,每個進程中都有一個監聽線程和多個工作線程。

  • 端口未重用情況下:

某個時刻,該監聽socket僅能由某一個進程持有,當該進程接收到請求后,才讓出監聽權,相當于各個監聽者只能輪流監聽。
在這里插入圖片描述

  • 端口重用情況下
    這里我們重用地址和端口兩次,三個監聽者都可以同時監聽了。
    三個監聽桶下,各個進程不用讓出監聽權,看上去減輕了互斥鎖的爭用,避免了饑餓,還能更高效地監聽,實現負載均衡,從而減輕了監聽線程的壓力,但是由于監聽的過程中需要消耗CPU,若是單核CPU是無法體現出端口復用的優勢的,反而會由于切換監聽線程而降低性能。
    在這里插入圖片描述
    所以若要使用端口復用,需要考慮幾點:
  • 是否將監聽進程/線程隔離在各自CPU中
  • 重用次數
  • CPU核數

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376809.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376809.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyEclipse老是彈出problem occurred窗口

有的時候是因為jsp頁面中的java腳本有誤&#xff0c;比如說<% String name"";>就會出現錯誤&#xff0c;因為結束標簽少了一個百分號&#xff05;。轉載于:https://www.cnblogs.com/passer1991/archive/2013/03/15/2961624.html

C++網絡編程快速入門(四):EPOLL模型使用

目錄基本使用方法step1:創建epollfdstep2:將fd綁定到epollfdstep3:調用epoll_wait檢測事件epoll_wait與poll、select區別所在水平觸發與邊緣觸發基本使用方法 step1:創建epollfd 創建一個epollfd&#xff0c;若epoll_create調用成功&#xff0c;則返回一個非負值的epollfd&am…

Mysql中代替like模糊查詢的一種方法

使用Mysql的函數instr,可代替傳統的like方式查詢,并且速度更快。 instr函數&#xff0c;第一個參數是字段&#xff0c;第二個參數是要查詢的串&#xff0c;返回串的位置&#xff0c;第一個是1&#xff0c;如果沒找到就是0. 例如&#xff1a; select username from prefix_user …

兩種大小端判斷的方式

網絡通信是按照字節流進行數據交換的&#xff0c;主機根據不同的CPU型號可能是大段存儲&#xff0c;也可能是小端存儲。而網絡字節序在TCP/IP協議中已經規定好了&#xff0c;采用大端的排序方式。 所以網絡通信中一般將需要傳輸的整數型值轉換成網絡字節序。 從本機字節序轉換成…

把數據庫復制成腳本(包含遠程以及數據庫數據)

1.啟動VS 2.服務器資源管理器 3.連接需要的數據庫 4.右鍵數據庫 選擇publist to provider.... 5.剩下的 選擇數據庫 選擇存放地址 下一步 這方法應該是用在把08的數據還原到05上面 明天用這個方法去盜取哈公司的數據庫 看行不行轉載于:https://www.cnblogs.com/Rock-Lee/a…

代理模式用來初始化的延遲下載

package 設計模式; //代理模式實現延遲加載來減小啟動時間 //數據庫查詢接口 interface IDBQery{ public String request(); }class DBQuery implements IDBQery {//創建一個DBQery非常耗時的&#xff0c;這里面我可以在需要DBQuery的時候在創建public DBQuery(){try {Thread.s…

Linux網絡故障排查命令(ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump)

目錄ifconfig-s&#xff0c;顯示網卡信息的精簡列表-a、up、down將IP地址綁定到某個網卡&#xff0c;以及解綁操作pingtelnetnetstatlsofnc模擬一個服務器程序和客戶端程序進行通信發送文件curltcpdump參數連接一個正常的監聽端口ifconfig 該命令用來查看當前系統的網卡和IP地…

My Oracle Support Metalink站點最近將放棄flash界面轉而使用ADF HTML

根據oracle官方博客的報道《The New My Oracle Support User Interface (HTML-based) 》&#xff0c; MY ORACLE SUPPORT開發team會在最近將support.oracle.com站點從原來的flash界面遷移到基于ADF HTML的用戶界面上。 實際上在2012年的 January 27&#xff0c; MOS開發team就…

BF算法

BF(Brute Force)算法是普通的模式匹配算法&#xff0c;BF算法的思想就是將目標串S的第一個字符與模式串T的第一個字符進行匹配&#xff0c;若相等&#xff0c;則繼續比較S的第二個字符和 T的第二個字符&#xff1b;若不相等&#xff0c;則比較S的第二個字符和T的第一個字符&…

心跳檢測以及應用層心跳包機制設計

博主聯系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950&#xff08;嵌入式方向&#xff09; QQ交流群&#xff1a;856398158&#xff08;后端方向&#xff09; 目錄心跳檢測應用場景死連接情況保活傳遞有效業務數據心跳包…

【APUE】孤兒進程與僵死進程

基本概念&#xff1a; 在unix/linux中&#xff0c;正常情況下&#xff0c;子進程是通過父進程創建的&#xff0c;子進程在創建新的進程。子進程的結束和父進程的運行是一個異步過程,即父進程永遠無法預測子進程 到底什么時候結束。 當一個 進程完成它的工作終止之后&#xff0c…

一個DBA的工作寫照

一個DBA的工作寫照&#xff0c; 一個DBA的內心 Know the DBA Mind! DBA也是 IT民工啊&#xff0c; 民工何苦為難民工&#xff01; 轉載于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968227.html

使用mutex和條件變量實現信號量

c提供了互斥量&#xff1a;mutex和條件變量&#xff1a;condition_variable&#xff0c;但是并沒有信號量&#xff1a;semaphore。而linux和windows系統庫會提供的。下面簡單介紹一下信號量的特性&#xff0c;然后給出一個簡單的demo&#xff0c;使用mutex condition_variable…

2014-07-28 使用Axure RP進行手機端BBS的原型設計

今天是在吾索實習的第14天。因本公司的微信公眾號需要有一個對外的技術交流平臺&#xff0c;所以我們小組打算設計一個手機端的BBS以滿足其要求。首先&#xff0c;我們需要做的是進行數據庫設計與原型設計&#xff0c;然后提交給經理驗收&#xff0c;看看是否合理&#xff0c;是…

jquery exif + lazyload實現延遲加載并顯示相片exif信息

對一個攝影愛好者來說&#xff0c;從高手的作品中學習是非常有用的。而照片的光圈&#xff0c;快門&#xff0c;感光度等信息是關注的重點。 上代碼&#xff1a; 1 <script src"../js/jquery.js" type"text/javascript"></script>2 <script…

undefined reference to `pthread_create‘(linux下Clion使用thread報錯)

完整報錯&#xff1a; [ Build | AsyncLogger | Debug ] /snap/clion/169/bin/cmake/linux/bin/cmake --build /home/dyy/CLionProjects/AsyncLogger/cmake-build-debug --target AsyncLogger -- -j 6 [ 50%] Linking CXX executable AsyncLogger /usr/bin/ld: CMakeFiles/Asy…

UVALive 6257 Chemist's vows --一道題的三種解法(模擬,DFS,DP)

題意&#xff1a;給一個元素周期表的元素符號&#xff08;114種&#xff09;&#xff0c;再給一個串&#xff0c;問這個串能否有這些元素符號組成&#xff08;全為小寫&#xff09;。 解法1&#xff1a;動態規劃 定義&#xff1a;dp[i]表示到 i 這個字符為止&#xff0c;能否有…

.NET開發相關使用工具和框架【轉載】

開發類 visual_studio 2005-2012系列----------語言開發工具 Visio 2003 / Power Desiger -----------建模工具 Dreamweaver_CS5 --------------網頁設計 ExpressionStudio 4 / blend 4 -------------wpf/silverlight設計工具 開發輔助類 SVN 主程序 ---------------文件控制 I…

JAVA數組的定義及用法

數組是有序數據的集合&#xff0c;數組中的每一個元素具有同樣的數組名和下標來唯一地確定數組中的元素。 1. 一維數組 1.1 一維數組的定義 type arrayName[]; type[] arrayName; 當中類型(type)能夠為Java中隨意的數據類型&#xff0c;包含簡單類型組合類型&#xff0c;數組名…

php操作httpsqs

php初始化httpsqs: include_once("httpsqs_client.php");$httpsqs new httpsqs("127.0.0.1", 1218, "mypass123", "utf-8"); php操作httpsqs:常用命令 操作入隊&#xff1a; $result $httpsqs->put(xiongwei2, test1); 獲取隊列中…