網絡編程之設置端口復用

首先來說一下為什么要設置端口復用,有些時候在調試服務器代碼時勢必會經常啟動或結束服務器進程,這樣就會出現當再次啟動服務器時有可能會出現端口綁定失敗的情況,造成這個情況的原因是由于你上次關閉服務器時有連接尚未斷開等等其他原因,出現綁定失敗也是系統的一個機制,當端口綁定的進程結束時系統會保留一段時間端口的綁定狀態,等過一會再去啟動服務器時就又可以綁定成功了。

也有一種方法,可以實現程序關閉時,立即啟動也可以綁定成功,那就是設置端口復用,下面介紹了如何在Windows和Linux下設置端口復用

Windows/Linux下設置端口復用

Windows和Linux系統下都是使用setsockopt函數來設置端口復用

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
// sockfd:要設置的文件描述符(包括套接字)
// level:級別,端口復用對應的是SOL_SOCKET
/* optname:選項的名字,下面是復用的選項SO_REUSEADDR:允許將套接字綁定到已在使用中的地址(地址復用)SO_REUSEPORT:允許將套接字綁定到已在使用中的端口(端口復用)**Windows下沒有這個選項,設置SO_REUSEADDR可以達到同樣的效果**
*/
// optval:設置optname選項的值,復用對應的都是int類型
// optlen:optval參數的大小
// 返回值:設置成功返回0,否則返回非0(Linux下返回-1,Windows下返回SOCKET_ERROR)

注意這個函數的調用要在套接字創建之后,綁定之前

示例代碼

// 創建套接字
int fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0)
{std::cout << "網絡初始化失敗\n";return;
}int optval = 1;
// 設置端口復用【Windows下不用設置,因為沒有SO_REUSEPORT】
int ret = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
printf("%s(%d): ret=%d\n", __FILE__, __LINE__, ret);
// 設置地址復用
ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
printf("%s(%d): ret=%d\n", __FILE__, __LINE__, ret);sockaddr_in addr{}, clientAddr{};
socklen_t cliAddrLen = sizeof(clientAddr);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY; // INADDR_ANY所有的意思
addr.sin_port = htons(9556);       // htons主機到網絡
// 綁定端口
if (bind(fd, (sockaddr *)&addr, sizeof(addr)) < 0)
{std::cout << "服務器綁定端口失敗\n";close(fd);return;
}

到這里,windows和Linux下設置套接字端口復用就介紹完了

感謝觀看學習,大佬們多多指點,愿明天的自己會感謝當下的努力!!!!

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

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

相關文章

stargo縮擴容starrocks集群,實現節點服務器替換

1.背景在企業中可能需要&#xff0c;將starrocks的某一臺服務器下架&#xff0c;換上另一臺服務器&#xff0c;如何實現這個操作&#xff0c;本篇將進行介紹&#xff1b;節點hadoop101hadoop102hadoop103hadoop104集群原集群節點新節點fe???&#xff08;下線&#xff09;?&…

Linux -- 進程間通信【命名管道】

目錄 一、命名管道定義 二、命名管道創建 1、指令 2、系統調用 3、刪除 三、匿名管道和命名管道的區別 四、命名管道的打開規則 五、代碼示例 1、comm.hpp 2、server.cc 3、client.cc 一、命名管道定義 # 匿名管道存在以下核心限制&#xff1a; 僅限親緣關系進程&a…

LinuxC系統多線程程序設計

一.多線程程序設計1. 線程概述&#xff1a;1.1 什么是線程?線程是進程中的一個實體(組成單元),是系統進程調度的最小單元。一個進程至少具有一個線程&#xff0c;如果進程僅有一個線程&#xff0c;該線程就代表進程本身。把代表進程本身的線程稱為主線程&#xff0c;一個進程…

Vue3 + TS + MapboxGL.js 三維地圖開發項目

文章目錄 1. 安裝依賴 2. 新建 Map 組件(components/MapView.vue) 3. 在頁面中使用(views/Home.vue) 4. 效果說明 1. 安裝依賴 npm install mapbox-gl @types/mapbox-gl --save?? 注意:需要去 Mapbox 官網,申請一個 access token。 package.json {"name":…

【編程語言】Rust 入門

目錄 一、Rust 是什么&#xff1f;為什么選擇它&#xff1f; 二、環境搭建&#xff0c;邁出第一步 2.1 Windows 系統安裝步驟 2.2 macOS 系統安裝步驟 2.3 Linux 系統安裝步驟 2.4 安裝過程中的常見問題及解決方案 三、基礎語法&#xff0c;構建知識大廈的基石 3.1 變量…

Python 編碼與加密全解析:從字符編碼到 RSA 簽名驗證

在 Python 開發中&#xff0c;字符編碼&#xff08;如 UTF-8、GBK&#xff09;和 數據加密&#xff08;如 Base64、MD5、RSA&#xff09;是處理數據傳輸、存儲安全的核心技術。本文結合實戰代碼&#xff0c;從基礎的字符編解碼入手&#xff0c;逐步深入到加密算法的應用&#x…

關于shell命令的擴展

目錄 一、邏輯運算符 1. &&&#xff08;AND&#xff09; 2. ||&#xff08;OR&#xff09; 3. 組合使用&#xff1a;A && B || C 二、輸出與重定向 1. echo 輸出 2. 標準文件描述符&#xff08;FD&#xff09; 3. 重定向操作符 4. 同時重定向 stdout 和…

MySQL EXPLAIN 查看執行計劃詳解

MySQL 的 EXPLAIN 命令。這是一個分析和優化 SQL 查詢性能不可或缺的強大工具。它展示了 MySQL 如何執行一條 SQL 語句&#xff0c;包括如何使用索引、表連接順序、估計的行數等關鍵信息。1. 如何使用 EXPLAIN在你要分析的 SELECT 語句前加上 EXPLAIN 或 EXPLAIN FORMATJSON&am…

TensorFlow 面試題及詳細答案 120道(51-60)-- 模型保存、加載與部署

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 51. TensorFlow中保存和加…

從零開始學Shell編程:從基礎到實戰案例

從零開始學Shell編程&#xff1a;從基礎到實戰案例 文章目錄從零開始學Shell編程&#xff1a;從基礎到實戰案例一、認識Shell&#xff1a;是什么與為什么學1.1 Shell的定義1.2 常用Shell解釋器二、Shell編程快速入門&#xff1a;編寫第一個腳本2.1 步驟1&#xff1a;創建腳本文…

機器學習算法全景解析:從理論到實踐

機器學習算法全景解析&#xff1a;從理論到實踐引言機器學習作為人工智能的核心組成部分&#xff0c;正在深刻地改變我們的世界。從推薦系統到自動駕駛&#xff0c;從醫療診斷到金融風控&#xff0c;機器學習算法無處不在。本文將全面系統地介紹機器學習的主要算法類別及其核心…

week5-[二維數組]對角線

week5-[二維數組]對角線 題目描述 給定一個 nnn\times nnn 的正方形二維數組&#xff0c;輸出它兩條對角線上元素的和。 輸入格式 輸入共 n1n 1n1 行。 第 111 行 111 個正整數 nnn。 接下來 nnn 行&#xff0c;每行 nnn 個正整數 aija_{ij}aij? 表示這個二維數組。 輸出格式…

GoogLeNet:深度學習中的“卷積網絡變形金剛“

大家好&#xff01;今天我們要聊一個在深度學習領域掀起革命的經典網絡——GoogLeNet&#xff08;又稱Inception v1&#xff09;。這個由Google團隊在2014年提出的模型&#xff0c;不僅拿下了ImageNet競賽冠軍&#xff0c;更用"網絡中的網絡"設計理念徹底改變了卷積神…

筆記本電腦藍牙搜索不到設備-已解決

方法1打開疑難解答&#xff0c;選擇其他疑難解答&#xff0c;下劃選擇藍牙&#xff0c;點擊運行&#xff0c;電腦自行檢測并修復藍牙方法2右鍵此電腦&#xff0c;選擇管理&#xff0c;找到自己的藍牙設備。然后對箭頭指向的這個點擊右鍵&#xff0c;選擇《更新驅動程序》&#…

WPF 程序用戶權限模塊利用MarkupExtension實現控制控件顯示

工作記錄 ------------------------------------------------------------------------------------------------------- MarkupExtension:XAML標記擴展 實現了什么作用&#xff1a;通過擴展標記將一種輸入轉化為另一種類型的輸出 思路&#xff1a; 不直接設置控件的Visib…

SpringMVC相關梳理

SpringMVC 返回值類型&#xff08;一&#xff09;核心返回值類型分類視圖渲染類&#xff1a;用于跳轉并渲染頁面&#xff0c;如String&#xff08;指定視圖名&#xff09;、ModelAndView&#xff08;視圖 數據&#xff09;。數據返回類&#xff1a;用于返回數據&#xff08;而…

Docker化性能監控平臺搭建:JMeter+InfluxDB+Grafana全攻略

你作為一名DevOps工程師或測試專家&#xff0c;正在監控一個高并發微服務系統&#xff1a;突發流量峰值導致響應延遲&#xff0c;服務器CPU飆升&#xff0c;但你只能手動查看日志&#xff0c;優化起來像大海撈針。這時&#xff0c;DockerJMeterInfluxDBGrafana的“夢幻四重奏”…

Adobe Acrobat 中通過 JavaScript 調用 Web 服務

強大的JavaScript支持&#xff0c;允許用戶通過腳本自動化處理PDF文檔。本文將詳細介紹如何在Adobe Acrobat環境中使用JavaScript調用Web服務&#xff0c;包括基礎概念、實現方法、代碼示例以及常見問題解決方案。 第一部分&#xff1a;基礎概念與技術背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 遠程調用(RPC)(三)

目錄 1 概念導入 2 添加依賴 3 在啟動類上添加注解 4 編寫對應的接口 5 注入并調用 6 日志 7 超時控制 8 超時重試 9 攔截器 10 Fallback兜底 1 概念導入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依賴 <!-- 遠程調用 --><depen…

【Flask】測試平臺開發,登陸重構

概述我們在開篇的時候實現了簡單的登陸功能&#xff0c;也實現了一個前后端聯調的登陸功能&#xff0c;但是你有沒有發現&#xff0c;那個登陸只是一個簡單的登陸&#xff0c;且密碼在接口返回的過程中是銘文密碼&#xff0c;在生產環境中使用肯定是不行的&#xff0c;一般密碼…