C++ Socket 获取本机可用端口号(QT)
1:加载套接字库,创建套接字(WSAStartup()/socket()); 2:绑定套接字到一个IP地址和一个端口上(bind()); 3:将套接字设置为监听模式等待连接请求(listen()); 4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()); 5:用返回的套接字和客户端进行通信(send()/recv()); 6:返回,等待另一连接请求; 7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
#ifdef WIN32 #include <winsock2.h> #else #include <sys/socket.h> #include <net/if.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> #include <sys/select.h> #endif bool InstanceServer::getAvailableListenPort(std::string &port) { bool result = true; #ifdef WIN32 WSADATA wsa; /*初始化socket资源*/ if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0) {return false; //代表失败 } #endif // 1. 创建一个socket int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 2. 创建一个sockaddr,并将它的端口号设为0 struct sockaddr_in addrto; memset(&addrto, 0, sizeof(struct sockaddr_in)); addrto.sin_family = AF_INET; addrto.sin_addr.s_addr = inet_addr(CLIENT_IP.c_str()); addrto.sin_port = 0; // 3. 绑定 int ret = ::bind(sock, (struct sockaddr *)&(addrto), sizeof(struct sockaddr_in)); if (0 != ret) {return false; } // 4. 利用getsockname获取 struct sockaddr_in connAddr; memset(&connAddr, 0, sizeof(struct sockaddr_in)); #ifdef WIN32 int len = sizeof(connAddr); #else unsigned int len = sizeof(connAddr); #endif ret = ::getsockname(sock, (sockaddr*)&connAddr, &len); if (0 != ret) {return false; } port = (std::string)ntohs(connAddr.sin_port); // 获取端口号 #ifdef WIN32 if (0 != closesocket(sock)) #else if (0 != close(sock)) #endif { result = false; } return result; }
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!


作者:风来风往风伤
出处:http://www.cnblogs.com/amwuau/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具