C++的UDP連接解析域名地址錯誤

背景

使用c++開發一個udp連接功能的腳本,可以接收發送數據,而且地址是經過內網穿透到外網的

經過

通常發送數據給目標地址,需要把目的地址結構化,要么使用inet_addr解析ip地址,要么使用inet_pton

sockaddr_in target_addr{};
target_addr.sin_family = AF_INET;
target_addr.sin_addr.s_addr = inet_addr("192.168.x.xxx");
target_addr.sin_port = htons(TARGET_PORT);
sockaddr_in target_addr{};
target_addr.sin_family = AF_INET;
if (inet_pton(AF_INET, "192.168.x.xxx", &target_addr.sin_addr) <= 0) {std::cerr << "Invalid target address" << std::endl;close(server_socket);close(client_socket);return 1;}
target_addr.sin_port = htons(TARGET_PORT);

正常的ip地址是可以的,但是如果是個域名(例如server.natappfree.cc),就會報錯
Failed to send data
Invalid target address

原因

inet_pton 函數主要用于將點分十進制的 IPv4 地址或 IPv6 地址字符串轉換為二進制形式,它只能處理 IP 地址,不能直接處理域名(如 server.natappfree.cc)。當你傳入域名時,它會因為無法識別該字符串為有效的 IP 地址格式而報錯 Invalid target address。
要解決這個問題,
你需要使用 DNS 解析將域名轉換為對應的 IP 地址。
在 C++ 中,可以使用 getaddrinfo 函數來完成這個任務
(如果你用python,是可以直接寫域名的)

示例

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
#include <errno.h>
#include <netdb.h>#define SERVER_PORT 1001
#define TARGET_PORT 1002
#define BUFFER_SIZE 1024int main() {// 創建服務器套接字int server_socket = socket(AF_INET, SOCK_DGRAM, 0);if (server_socket == -1) {std::cerr << "Failed to create server socket" << std::endl;return 1;}// 綁定服務器地址sockaddr_in server_addr{};server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");server_addr.sin_port = htons(SERVER_PORT);if (bind(server_socket, reinterpret_cast<sockaddr*>(&server_addr), sizeof(server_addr)) == -1) {std::cerr << "Failed to bind server socket" << std::endl;close(server_socket);return 1;}std::cout << "Listening on " << inet_ntoa(server_addr.sin_addr) << ":" << ntohs(server_addr.sin_port) << std::endl;// 創建客戶端套接字int client_socket = socket(AF_INET, SOCK_DGRAM, 0);if (client_socket == -1) {std::cerr << "Failed to create client socket" << std::endl;close(server_socket);return 1;}// 目標地址addrinfo hints{};hints.ai_family = AF_INET;hints.ai_socktype = SOCK_DGRAM;addrinfo* result;int status = getaddrinfo("server.natappfree.cc", std::to_string(TARGET_PORT).c_str(), &hints, &result);if (status != 0) {std::cerr << "getaddrinfo failed: " << gai_strerror(status) << std::endl;close(server_socket);close(client_socket);return 1;}sockaddr_in* target_addr = reinterpret_cast<sockaddr_in*>(result->ai_addr);const char* message = "i am udp";int i = 10;while (i > 0) {char buffer[BUFFER_SIZE];sockaddr_in client_addr{};socklen_t client_addr_len = sizeof(client_addr);// 接收數據ssize_t recv_len = recvfrom(server_socket, buffer, BUFFER_SIZE, 0, reinterpret_cast<sockaddr*>(&client_addr), &client_addr_len);if (recv_len == -1) {std::cerr << "Failed to receive data" << std::endl;continue;}buffer[recv_len] = '\0';std::cout << "recv " << buffer << " from " << inet_ntoa(client_addr.sin_addr) << ":" << ntohs(client_addr.sin_port) << std::endl;// 發送數據ssize_t send_len = sendto(client_socket, message, strlen(message), 0, reinterpret_cast<sockaddr*>(target_addr), sizeof(*target_addr));if (send_len == -1) {std::cerr << "Failed to send data: " << strerror(errno) << std::endl;}std::this_thread::sleep_for(std::chrono::seconds(1));i--;}// 釋放地址信息freeaddrinfo(result);// 關閉套接字close(server_socket);close(client_socket);return 0;
}

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

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

相關文章

Spark,上傳文件

上傳文件 1.上傳 先使用命令打開HDFS的NameNode [roothadoop100 hadoop-3.1.3]$ sbin/start-dfs.sh [roothadoop100 hadoop-3.1.3]$ sbin/stop-dfs.sh 和YARN的Job [roothadoop101 hadoop-3.1.3]$ sbin/start-yarn.sh [roothadoop101 hadoop-3.1.3]$ sbin/stop-yarn.sh 在Nam…

如何為Linux/Android Kernel 5.4和5.15添加 fuse passthrough透傳功能 ?

背景 參考&#xff1a;Google文檔 FUSE 透傳 參考此文檔&#xff0c;目前kernel.org提供的fuse passthrough補丁在6.9版本之后&#xff0c;但想要在5.4和5.15版本內核做移植應該如何簡單點呢&#xff1f;文檔中提到 Android的內核為5.4 和 5.15版本內核做了fuse passthrough功…

Ubuntu 防火墻配置

Ubuntu 的防火墻配置可以參考文章&#xff1a;Firewall - Ubuntu Server documentation 22 端口 需要注意的是&#xff0c;在啟動防火墻之前&#xff0c;需要先開放 22 端口。 否則 SSH 將會拒絕你連接防火墻。 開放 22 端口的命令為&#xff1a;sudo ufw allow 22 添加端…

Jetson 設備卸載 OpenCV 4.5.4 并編譯安裝 OpenCV 4.2.0

?一、卸載 OpenCV 4.5.4? 清除已安裝的 OpenCV 庫? sudo apt-get purge libopencv* python3-opencv # 卸載所有APT安裝的OpenCV包?:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理殘留依賴?:ml-citation{ref"1,4"…

《AI大模型應知應會100篇》第57篇:LlamaIndex使用指南:構建高效知識庫

第57篇&#xff1a;LlamaIndex使用指南&#xff1a;構建高效知識庫 摘要 在大語言模型&#xff08;LLM&#xff09;驅動的智能應用中&#xff0c;如何高效地管理和利用海量知識數據是開發者面臨的核心挑戰之一。LlamaIndex&#xff08;原 GPT Index&#xff09; 是一個專為構建…

Sentinel[超詳細講解]-4

&#x1f693; 主要講解流控模式的 三種方式中的兩種&#xff1a; 直接、鏈路&#x1f680; 1?? 直接模式 &#x1f68e; 直接模式&#xff1a;對資源本身進行限流&#xff0c;例如對某個接口進行限流&#xff0c;當該接口的訪問頻率超過設定的閾值時&#xff0c;直接拒絕新的…

工作記錄 2017-03-24

工作記錄 2017-03-24 序號 工作 相關人員 1 修改了郵件上的問題。 更新RD服務器。 郝 更新的問題 1、修改了New User時 init的保存。 2、文件的查詢加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的處理。 識別引擎監控 Ps (iCDA LOG :剔除…

裴蜀定理:整數解的奧秘

裴蜀定理&#xff1a;整數解的奧秘 在數學的世界里&#xff0c;裴蜀定理&#xff08;Bzout’s Theorem&#xff09;是數論中一個非常重要的定理&#xff0c;它揭示了二次方程和整數解之間的關系。它不僅僅是純粹的理論知識&#xff0c;還在計算機科學、密碼學、算法優化等多個…

python之 “__init__.py” 文件

提示&#xff1a;python之 “init.py” 文件 文章目錄 前言一、Python 中 __init__.py 文件的理解1. What&#xff08;是什么&#xff09;2. Why&#xff08;為什么需要&#xff09;3. Where&#xff08;在哪里使用&#xff09;4. How&#xff08;如何使用&#xff09; 二、問題…

Gemini 2.5 Pro與Claude 3.7 Sonnet編程性能對比

AI領域的語言模型競賽日趨白熱化,尤其在編程輔助方面表現突出。 Gemini 2.5 Pro和Claude 3.7 Sonnet作為該領域的佼佼者,本文通過一系列編程測試與基準評估對兩者的編碼功能進行對比分析。 核心結論: ? Gemini 2.5 Pro在SWE Bench硬核編程測試中以63.8%的通過率略勝Clau…

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays論文閱讀

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 論文的研究目標與實際問題意義1.1 研究目標1.2 解決的實際問題1.3 實際意義2. 論文提出的新方法、模型與公式2.1 核心創新:標量化近似表達式關鍵推導步驟:公式優勢:2.2 與經典方法的對比傳統方…

GIT 撤銷上次推送

注意&#xff1a;在執行下述操作之前先備份現有工作進度&#xff0c;如果不慎未保存&#xff0c;在代碼編輯器中正在修改的文件下&#xff0c;使用CtrlZ 撤銷試試 撤銷推送的方法 情況 1&#xff1a;您剛剛推送到遠程倉庫 如果您的推送操作剛剛完成&#xff0c;并且沒有其他…

透視飛鶴2024財報:如何打贏奶粉罐里的科技戰?

去年乳制品行業壓力還是不小的&#xff0c;尼爾森IQ指出2024年國內乳品市場仍處在收縮區間。但是&#xff0c;總有龍頭能抗住壓力&#xff0c;飛鶴最近交出的2024財報中就有很多亮點。 比如&#xff0c;2024年飛鶴營收207.5億元、同比增長6%&#xff0c;凈利潤36.5億元&#x…

解決STM32CubeMX中文注釋亂碼

本人采用【修改系統環境變量】的方法 1. 使用快捷鍵 win X&#xff0c;打開【系統R】&#xff0c;點擊【高級系統設置】 2. 點擊【環境變量】 3. 點擊【新建】 4.按圖中輸入【JAVA_TOOL_OPTIONS】和【-Dfile.encodingUTF-8】&#xff0c;新建環境變量后重啟CubeMX即可。 解釋…

使用typescript實現游戲中的JPS跳點尋路算法

JPS是一種優化A*算法的路徑規劃算法&#xff0c;主要用于網格地圖&#xff0c;通過跳過不必要的節點來提高搜索效率。它利用路徑的對稱性&#xff0c;只擴展特定的“跳點”&#xff0c;從而減少計算量。 deepseek生成的總是無法完整運行&#xff0c;因此決定手寫一下。 需要注…

Jetpack Compose 狀態管理指南:從基礎到高級實踐

在Jetpack Compose中&#xff0c;界面狀態管理是構建響應式UI的核心。以下是Compose狀態管理的主要概念和實現方式&#xff1a; 基本狀態管理 1. 使用 mutableStateOf Composable fun Counter() {var count by remember { mutableStateOf(0) }Button(onClick { count }) {T…

vant4+vue3上傳一個pdf文件并實現pdf的預覽。使用插件pdf.js

注意下載的插件的版本"pdfjs-dist": "^2.2.228", npm i pdfjs-dist2.2.228 然后封裝一個pdf的遮罩。因為pdf文件有多頁&#xff0c;所以我用了swiper輪播的形式展示。因為用到移動端&#xff0c;手動滑動頁面這樣比點下一頁下一頁的方便多了。 直接貼代碼…

Leetcode hot 100(day 4)

翻轉二叉樹 做法&#xff1a;遞歸即可&#xff0c;注意判斷為空 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return nullptr;TreeNode* noderoot->left;root->leftinvertTree(root->right);root->rightinvertTree(node);retu…

C,C++語言緩沖區溢出的產生和預防

緩沖區溢出的定義 緩沖區是內存中用于存儲數據的一塊連續區域&#xff0c;在 C 和 C 里&#xff0c;常使用數組、指針等方式來操作緩沖區。而緩沖區溢出指的是當程序向緩沖區寫入的數據量超出了該緩沖區本身能夠容納的最大數據量時&#xff0c;額外的數據就會覆蓋相鄰的內存區…

大數據(4)Hive數倉三大核心特性解剖:面向主題性、集成性、非易失性如何重塑企業數據價值?

目錄 背景&#xff1a;企業數據治理的困境與破局一、Hive數據倉庫核心特性深度解析1. ?面向主題性&#xff08;Subject-Oriented&#xff09;&#xff1a;從業務視角重構數據?2. ?集成性&#xff08;Integrated&#xff09;&#xff1a;打破數據孤島的統一視圖?3. ?非易失…