当前位置: 首页 > article >正文

C++ 套接字函数详细介绍

目录

    • 头文件
    • 1. 套接字创建与配置
    • 2. 绑定地址与端口
    • 3. 连接建立
    • 4. 数据传输
    • 5. 套接字选项
    • 6. 地址转换
    • 7. 套接字关闭
    • 8. 其他实用函数

C++ 套接字函数详细介绍
套接字(Socket)是网络通信的基本端点,C++中通常使用BSD套接字API进行网络编程。以下是主要的套接字相关函数及其详细介绍:

头文件

#include <sys/socket.h>   // 套接字基本函数
#include <netinet/in.h>   // IPv4相关定义
#include <arpa/inet.h>    // IP地址转换
#include <unistd.h>       // close()等系统调用
#include <netdb.h>        // 主机和服务信息查询
#include <cstring>        // memset()等字符串操作
#include <iostream>       // 标准输入输出

在C++中,socket() 函数及其相关套接字功能的声明位于 <sys/socket.h> 头文件中。这个头文件是进行套接字编程的基础,包含了创建和管理套接字所需的函数和结构体定义。

详细说明

<sys/socket.h>
包含的内容:
套接字创建函数:socket(), socketpair()
套接字绑定函数:bind()
连接建立函数:connect(), listen(), accept()
数据传输函数:send(), recv(), sendto(), recvfrom(), sendmsg(), recvmsg()
套接字选项设置函数:setsockopt(), getsockopt()
套接字关闭函数:shutdown()
各种套接字相关的结构体和宏定义

1. 套接字创建与配置

1)socket()

#include <sys/socket.h>int socket(int domain, int type, int protocol);
**功能**:创建一个新的套接字
**参数**:domain:通信域(地址族)AF_INET:IPv4协议AF_INET6:IPv6协议AF_LOCAL:本地通信(Unix域套接字)type:套接字类型SOCK_STREAM:面向连接的TCP套接字SOCK_DGRAM:无连接的UDP套接字SOCK_RAW:原始套接字protocol:通常为0(自动选择默认协议)返回值:成功返回套接字描述符,失败返回-1

2)socketpair()

#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
功能:创建一对相互连接的套接字
常用于:进程间通信

2. 绑定地址与端口

bind()

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
**功能**:将套接字绑定到特定地址和端口
**参数**:sockfd:套接字描述符addr:指向sockaddr结构体的指针addrlen:地址结构体长度

注意:对于客户端通常不需要显式调用,服务器端必须调用

3. 连接建立

connect()

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
**功能**:客户端发起连接请求
参数:同bind()
返回值:成功返回0,失败返回-1

listen()

#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:服务器端开始监听连接请求
参数:backlog:等待连接队列的最大长度

accept()

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接受客户端连接请求
返回值:成功返回新的套接字描述符(用于与客户端通信),失败返回-1

4. 数据传输

send() / recv()

#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:面向连接的TCP数据传输
参数:flags:通常为0,或MSG_OOB(带外数据)、MSG_PEEK(查看但不移除)等

sendto() / recvfrom()

#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:无连接的UDP数据传输

sendmsg() / recvmsg()

#include <sys/socket.h>
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
功能:更高级的数据传输接口,支持分散/聚集I/O和辅助数据

5. 套接字选项

setsockopt() / getsockopt()

#include <sys/socket.h>
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
int getsockopt(int sockfd, int level, int optname,void *optval, socklen_t *optlen);

常用选项:

SO_REUSEADDR:允许地址重用
SO_KEEPALIVE:保持连接
SO_BROADCAST:允许广播
SO_LINGER:关闭时行为控制
TCP_NODELAY:禁用Nagle算法

6. 地址转换

inet_pton() / inet_ntop()

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
功能:IP地址文本表示与二进制格式转换

htonl(), htons(), ntohl(), ntohs()

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
功能:主机字节序与网络字节序转换

7. 套接字关闭

close()

#include <unistd.h>
int close(int fd);
功能:关闭套接字描述符

shutdown()

#include <sys/socket.h>
int shutdown(int sockfd, int how);
功能:更精细地关闭套接字
参数:SHUT_RD:禁止接收SHUT_WR:禁止发送SHUT_RDWR:两者都禁止

8. 其他实用函数

getaddrinfo() / freeaddrinfo()

int getaddrinfo(const char *node, const char *service,const struct addrinfo *hints, struct addrinfo **res);
void freeaddrinfo(struct addrinfo *res);
功能:主机名和服务名到地址信息的转换

getnameinfo()

int getnameinfo(const struct sockaddr *sa, socklen_t salen,char *host, size_t hostlen,char *serv, size_t servlen, int flags);
功能:地址信息到主机名和服务名的转换

示例代码片段
TCP客户端示例

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in serv_addr{};serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);connect(sockfd, (sockaddr*)&serv_addr, sizeof(serv_addr));const char *msg = "Hello, Server!";send(sockfd, msg, strlen(msg), 0);char buffer[256];recv(sockfd, buffer, sizeof(buffer)-1, 0);buffer[recv_len] = '\0';std::cout << "Received: " << buffer << std::endl;close(sockfd);return 0;
}

TCP服务器示例

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>int main() {int server_fd = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in address{};address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);bind(server_fd, (sockaddr*)&address, sizeof(address));listen(server_fd, 5);sockaddr_in client_addr{};socklen_t client_addr_len = sizeof(client_addr);int client_fd = accept(server_fd, (sockaddr*)&client_addr, &client_addr_len);char buffer[256];recv(client_fd, buffer, sizeof(buffer)-1, 0);buffer[recv_len] = '\0';std::cout << "Received: " << buffer << std::endl;const char *response = "Hello, Client!";send(client_fd, response, strlen(response), 0);close(client_fd);close(server_fd);return 0;
}

注意事项
错误处理:所有套接字函数调用后都应检查返回值
阻塞与非阻塞:套接字默认是阻塞的,可通过fcntl()或ioctl()设置为非阻塞
多线程安全:在多线程环境中使用套接字需要特别注意同步问题
资源释放:确保在程序退出前关闭所有打开的套接字
以上是C++中套接字编程的主要函数介绍,实际开发中通常会将这些函数封装在更高级的类中,如C++的std::net(C++11起)或第三方库如Boost.Asio。

相关文章:

C++ 套接字函数详细介绍

目录 头文件1. 套接字创建与配置2. 绑定地址与端口3. 连接建立4. 数据传输5. 套接字选项6. 地址转换7. 套接字关闭8. 其他实用函数 C 套接字函数详细介绍 套接字(Socket)是网络通信的基本端点&#xff0c;C中通常使用BSD套接字API进行网络编程。以下是主要的套接字相关函数及其…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

程序设计语言----软考中级软件设计师(自用学习笔记)

目录 1、解释器和编译器 2、程序的三种控制结构 3、程序中的数据必须具有类型 4、编译、解释程序翻译阶段 5、符号表 6、编译过程 7、上下文无关文法 8、前、中、后缀表达式 9、前、后缀表达式计算 10、语法树中、后序遍历 11、脚本语言和动态语言 12、语法分析方法…...

火山RTC 7 获得远端裸数据

一、获得远端裸数据 1、获得h264数据 1&#xff09;、远端编码后视频数据监测器 /*** locale zh* type callback* region 视频管理* brief 远端编码后视频数据监测器<br>* 注意&#xff1a;回调函数是在 SDK 内部线程&#xff08;非 UI 线程&#xff09;同步抛出来的&a…...

通过SMTP协议实现Linux邮件发送配置指南

一、环境准备与基础配置 1. SMTP服务开通&#xff08;以qq邮箱为例&#xff09; 登录qq邮箱网页端&#xff0c;进入「设置」-「POP3/SMTP/IMAP」 开启「SMTP服务」并获取16位授权码&#xff08;替代邮箱密码使用&#xff09; 记录关键参数&#xff1a; SMTP服务器地址&#…...

若依框架页面

1.页面地址 若依管理系统 2.账号和密码 管理员 账号admin 密码admin123 运维 账号yuwei 密码123456 自己搭建的地址方便大家学习&#xff0c;不要攻击哦&#xff0c;谢谢啊...

44、私有程序集与共享程序集有什么区别?

私有程序集&#xff08;Private Assembly&#xff09;与共享程序集&#xff08;Shared Assembly&#xff09;是.NET框架中程序集部署的两种不同方式&#xff0c;它们在部署位置、版本控制、访问权限等方面存在显著差异&#xff0c;以下是对二者的详细比较&#xff1a; 1. 部署…...

【Java面试题】——this 和 super 的区别

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;【Java】内容概括 【前言】 在Java的世界里&#xff0c;this和 super是两个非常重要且容易混淆的关键字。无论是在日常…...

记录 QT 在liunx 下 QFileDialog 类调用问题 ()Linux下QFileDialog没反应)

1. 2025.05.14 踩坑记录 因为QT 在 liunx 文件系统不同导致的 Windows &#xff1a; QString filePath QFileDialog::getOpenFileName(nullptr, "选择文件", ".", "文本文件 (*.txt);所有文件 (*.*)"); 没问题 liunx 下 打不开&#xff…...

CentOS 7 内核升级指南:解决兼容性问题并提升性能

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; CentOS 7 默认搭载的 3.10.x 版本内核虽然稳定&#xff0c;但随着硬件和软件技术的快速发展&#xff0c;可能面临以下问题&#xff1a; 硬件兼容性不足&#xff1a;新…...

【前端】:单 HTML 去除 Word 批注

在现代办公中&#xff0c;.docx 文件常用于文档编辑&#xff0c;但其中的批注&#xff08;注释&#xff09;有时需要在分享或归档前被去除。本文将从原理出发&#xff0c;深入剖析如何在纯前端环境下实现对 .docx 文件注释的移除&#xff0c;并提供完整的实现源码。最后&#x…...

解决 PicGo 上传 GitHub图床及Marp中Github图片编译常见难题指南

[目录] 0.行文概述 1.PicGo图片上传失败 2.*关于在Vscode中Marp图片的编译问题* 3.总结与启示行文概述 写作本文的动机是本人看到了Awesome Marp&#xff0c;发现使用 Markdown \texttt{Markdown} Markdown做PPT若加持一些 CSS , JavaScript \texttt{CSS},\texttt{JavaScript} …...

软考 系统架构设计师系列知识点之杂项集萃(59)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;58&#xff09; 第96题 假设关系模式R(U, F)&#xff0c;属性集U{A, B, C}&#xff0c;函数依赖集F{A->B, B->C}。若将其分解为p{R1(U1, F1), R2(U2, F2)&#xff0c;其中U1{A, B}, U2{A, …...

python使用matplotlib画图

【README】 plot画图有两种方法&#xff1a;包括 plt.plot(), ax.plot()-画多个子图 &#xff0c;其中ax表示某个坐标轴; 【1】画单个图 import matplotlib # 避免兼容性问题&#xff1a;明确指定 matplotlib 使用兼容的后端&#xff0c;TkAgg 或 Agg matplotlib.use(TkAgg) …...

鸿蒙OSUniApp 开发实时聊天页面的最佳实践与实现#三方框架 #Uniapp

使用 UniApp 开发实时聊天页面的最佳实践与实现 在移动应用开发领域&#xff0c;实时聊天功能已经成为许多应用不可或缺的组成部分。本文将深入探讨如何使用 UniApp 框架开发一个功能完善的实时聊天页面&#xff0c;从布局设计到核心逻辑实现&#xff0c;带领大家一步步打造专…...

upload-labs通关笔记-第5关 文件上传之.ini绕过

目录 一、ini文件绕过原理 二、源码审计 三、渗透实战 1、查看提示 2、制作.user.ini文件 &#xff08;1&#xff09;首先创建一个文本文件 &#xff08;2&#xff09;保存文件名为.user.ini 2、制作jpg后缀脚本 &#xff08;1&#xff09;创建一个文本文件 &#xf…...

ssti模板注入学习

ssti模板注入原理 ssti模板注入是一种基于服务器的模板引擎的特性和漏洞产生的一种漏洞&#xff0c;通过将而已代码注入模板中实现的服务器的攻击 模板引擎 为什么要有模板引擎 在web开发中&#xff0c;为了使用户界面与业务数据&#xff08;内容&#xff09;分离而产生的&…...

填涂颜色(bfs)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝 含泪播种的人一定能含笑收获! 题目描述 由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现…...

ros1+docker环境快速搭建

快速使用python 解析ros1的bag消息ros这个东西可以说安装起来非常麻烦的&#xff0c;费时费力&#xff0c;很可能还安装不成功&#xff0c;特别是我的环境是ubuntu22.04 &#xff0c;官方都不支持安装ros1。因此一个可行且快速的方法是使用别人配置好的ros的docker环境 一、下…...

vscode extention踩坑记

# npx vsce package --allow-missing-repository --no-dependencies #耗时且不稳定 npx vsce package --allow-missing-repository #用这行 code --install-extension $vsixFileName --force我问ai&#xff1a;为什么我的.vsix文件大了那么多 ai答&#xff1a;因为你没有用 --n…...

GpuGeek全栈AI开发实战:从零构建企业级大模型生产管线(附完整案例)

目录 背景一、算力困境&#xff1a;AI开发者的「三重诅咒」1.1 硬件成本黑洞‌1.2 资源调度失衡‌1.3 环境部署陷阱‌ 二、三大核心技术突破GpuGeek的破局方案2.1 ‌分时切片调度引擎&#xff08;Time-Slicing Scheduler&#xff09;‌2.2 ‌异构计算融合架构2.3 ‌AI资产自动化…...

【TroubleShoot】禁用Unity Render Graph API 兼容模式

使用Unity 6时新建了项目&#xff0c;有一个警告提示&#xff1a; The project currently uses the compatibility mode where the Render Graph API is disabled. Support for this mode will be removed in future Unity versions. Migrate existing ScriptableRenderPasses…...

数据库字段唯一性修复指南:从设计缺陷到规范实现

数据库字段唯一性修复指南&#xff1a;从设计缺陷到规范实现 一、问题背景 表结构设计缺陷&#xff1a; sys_user 表未对 dingtalk_user_id&#xff08;钉钉用户ID&#xff09;字段设置唯一性约束&#xff0c;导致数据重复&#xff0c;引发以下问题&#xff1a; 系统稳定性风…...

DataX从Mysql导数据到Hive分区表案例

0、下载DataX并解压到对应目录 DataX安装包&#xff0c;开箱即用&#xff0c;无需配置。 https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz 相关参考文档 https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md 1、Hive分区…...

高性能编程相关

​​​​​​​常见高性能编程技巧&#xff1a; 一&#xff0c;系统级性能优化&#xff1a;从系统架构设计考虑&#xff0c;例如消息队列&#xff0c;模块分成分级&#xff0c;IO读写带宽等 二&#xff0c;算法级性能优化&#xff1a;时间和空间优化 三&#xff0c;代码级性能优…...

vulnhub靶场——secarmy

靶机&#xff1a;secarmy靶机&#xff0c;IP地址为192.168.230.18 攻击&#xff1a;kali&#xff0c;IP地址为192.168.230.134 靶机和攻击机都采用VMware虚拟机&#xff0c;都采用NAT模式 端口扫描&#xff1a; nmap 192.168.230.18 -O -A -p- --reason -sV 21/tcp (ftp): 开…...

labview硬件采集

(1)硬件的描述 &#xff08;2&#xff09;实验步骤1&#xff1a; &#xff08;3&#xff09;实验步骤2 库名/路径的选择要使用32位的开发资料 &#xff08;4&#xff09;实验步骤3 &#xff08;5&#xff09;实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…...

openfeign与dubbo调用下载excel实践

一、前言 openfeign和dubbo均是rpc框架 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;框架 是一种允许程序像调用本地方法一样调用远程服务器上函数的技术。它隐藏了底层网络通信的复杂性&#xff0c;让开发者可以专注于业务逻辑&#xff0c;实现…...

ISP有感自发

一、黑电平 由于传感器&#xff0c;即便在无光的情况下&#xff0c;依然会产生微小的暗电流&#xff0c;这些暗电流可能是噪点会影响后期的调试。因此&#xff0c;我们便将这些电流处理为0&#xff0c;成为纯黑的颜色。可以在源头消除这些误差。 如何矫正黑电平&#xff1a; …...

web 自动化之 PO 设计模式详解

文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...