socket编程 - 详解

news/2025/12/6 15:47:34/文章来源:https://www.cnblogs.com/ljbguanli/p/19315912

socket编程 - 详解

正确理解端口号

理解源IP地址和目的IP地址

IP地址可以在网络中唯一标识一台主机,这也就意味着,只要我知道你的IP地址,就能向你的主机发送数据。但是这有一个问题, 主机接收到数据之后发送给哪个进程?此时出现了端口。端口是主机标识进程的一个16位的整数。拿着IP地址和端口号,我们就能在网络中定位到唯一的主机上的唯一的进程。更为准确的,网络通信本质还是进程间通信,只不过这两个进程可能不在一台主机上。
在这里插入图片描述

认识端口号

端口是传输层协议的内容

  • 端口号是一个2字节16位的整数
  • 端口号用来表示一个进程,告诉操作系统,当前这个数据要交给哪个进程来处理
  • IP地址+端口能够表示网络中某一台主机的某一个进程
  • 一个端口只能被一个进程占用,一个进程可以占用多个端口
    在这里插入图片描述
端口范围划分

端口号和进程ID(PID)

前面提到端口号是为了唯一标识一台主机的某个进程,那么为什么不适用PID呢?

  • PID标识的是正在运行中的进程,一旦程序退出,这个进程就找不到了
  • PID是变化的,可能每次运行程序得到的PID都不一样
  • 而且进程ID属于操作系统层面,由操作系统控制,端口号处于网络层面,如果端口号和进程PID绑定,会让系统进程管理和网络强耦合。

理解socket

网络字节序

我们知道,数据在内存中的存储方式有大小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大小端之分,网络数据流也有大小端之分。如果传输数据双方的主机一个是大端存储,一个是小端存储,假设我们不做任何处理就将数据发送能够给对方,那对方拿到的数据就会出现乱码。
TCP/IP 协议规定,网络数据流应采用大端字节序,即低地址高字节,所以如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可。
在这里插入图片描述

  • htonl函数的作用是将 32 位的长整数从主机字节序转换为网络字节序,例如将 IP 地址转换后准备发送
  • htons函数的作用是将 16 位的短整数从主机字节序转换为网络字节序,例如将 端口号 地址转换后准备发送
  • ntohl函数的作用是将 32 位的长整数从网络字节序转换为主机字节序,例如将 接收到的 IP 地址转换后使用
  • ntohs函数的作用是将 16 位的短整数从网络字节序转换为主机字节序,例如将接收到的端口号转换后使用

socket编程接口

C
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

一般来说,使用socket编程需要包含四个头文件

#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>
创建socket套接字
// 创建一个IPv4的TCP套接字
int socket(int domain, int type, int protocol);
  • domain:地址簇,常见的有AF_INET(IPv4),和AF_INET6(IPv6)
  • type:套接字类型,常见的有SOCK_STREAM(TCP)SOCK_DGRAM(UDP)
  • protocol:协议,通常为0(自动选择),也可以指定协议,如IPPROTO_TCPIPPROTO_UDP
  • 成功时返回一个套接字描述符,失败时返回-1,并设置error
    也就是说,调用socket这个函数跌倒一个文件描述符,在操作系统的内核中,它对应一个数据结构,存储了该套接字的各种状态信息和资源,例如IP地址、端口号、通信协议、缓冲区等
bind绑定套接字

bind函数将套接字绑定到一个IP地址和端口号。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:套接字描述符
  • addr:指向sockaddr结构体的指针,该结构体对象包含了要绑定的地址信息,对于IPv4,使用sockaddr_in 结构体;对于IPv6,使用 sockaddr_in6 结构体。
  • addr_lenaddr指向结构体对象的大小,通常使用sizeof获取
  • 成功时返回0,失败时返回-1并设置errno
listen建立监听

listen函数使套接字进入监听状态,准备接受连接请求。

int listen(int sockfd, int backlog);
  • sockfd:套接字描述符
  • backlog:挂起连接的最大队列长度,即最多有多少个连接可以等待被接受
  • 成功时返回0,失败时返回-1并设置errno
accept接受连接

accept函数接受一个连接请求,返回一个新的套接字描述符,用于与客户端通信

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd:监听套接字描述符,即listen获取的套接字描述符
  • addr指向sockaddr结构体对象的指针,用来存储客户端地址信息
  • sockfd:监听套接字描述符,即listen获取的套接字描述符
  • 成功时返回新的套接字描述符,失败时返回-1并设置errno
connect建立连接

connect函数用于客户端连接到服务器

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd:套接字描述符
  • addr指向sockaddr 结构体对象的指针,用于存储服务器地址信息
  • addrlen: sockaddr 结构体的大小。
  • 成功时返回0,失败时返回-1并设置errno
sendto发送数据

sendto函数是用于在 无连接套接字**(如UDP)上发送数据 的。它允许程序指定目标地址,从而可以在一个套接字上与多个目标进行通信。

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
  • sockfd:套接字描述符,通过socket函数创建
  • buf:要发送的缓冲区
  • len:要发送的数据的长度
  • flags:发送标志,通常为0
  • dest_addr:指向sockaddr结构体的指针,包括目的地址和端口号
  • addlen:sockaddr结构器的大小
  • 成功时返回发送的字节数,失败时返回-1,并设置 errno 以指示错误
接收数据

recvfrom 函数用于在无连接的套接字(如UDP)上接收数据,它允许程序获取发送数据的源地址。它常用于UDP服务器接收数据包,并且能够知道数据包的来源。

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd: 套接字描述符,通过 socket 函数创建。
  • buf: 指向存储接收数据的缓冲区。
  • len: 缓冲区的长度,即可以接收的最大字节数。
  • flags: 接收标志,通常为0。
  • src_addr: 指向 sockaddr 结构体的指针,用于存储发送方的地址信息。
  • addrlen: 指向 socklen_t 变量的指针,表示 sockaddr 结构体的大小。调用函数时需要设置为 sockaddr 结构体的大小,函数返回时设置为实际地址的长度。
close关闭套接字

跟关闭文件描述符一样,创建的套接字描述符用完之后也需要手动关闭,同样的使用close函数。

int close(int fd);
  • 成功返回0,失败返回-1
sockaddr结构体

在这里插入图片描述

  • sockaddr
struct sockaddr {
sa_family_t sa_family;  // 地址族(Address family)
char sa_data[14];       // 套接字地址数据(Socket address data)
};
  • sockaddr_in:
struct sockaddr_in {
sa_family_t sin_family;   // 地址族(AF_INET)
in_port_t sin_port;       // 端口号(Port number),网络字节序
struct in_addr sin_addr;  // IPv4地址
char sin_zero[8];         // 填充字节,使结构体大小与 `sockaddr` 一致
};
  • in_addr
struct in_addr {
uint32_t s_addr;  // 32位IPv4地址,网络字节序
};

in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/990301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年五大源头井式炉厂家推荐,井式炉实力供应商全解析

在工业热处理领域,井式炉作为周期式作业的核心设备,是杆类、长轴类零件热处理的关键工具,其性能直接影响工件精度与生产效率。面对市场上众多井式炉供应商,如何选择源头井式炉厂家与井式炉实力供应商?以下为你推荐…

2025 年温州包车公司联系方式推荐:聚游汽服多车型定制 高性价比保障,安全便捷!

导读 近年来,随着温州文旅产业的蓬勃发展、商务交流的日益频繁,以及企业团建、家庭出游等多元化出行需求的持续释放,包车服务行业迎来了快速发展期。据温州市交通运输协会数据显示,2024 年温州地区包车服务订单量同…

2025 年贵阳 GEO 厂商最新推荐榜,技术实力与市场口碑深度解析,助力企业精准选合作方贵阳 GEO 训练营,贵阳 GEO 实战培训,贵阳 GEO 全案服务,贵阳 GEO 流量挖掘公司推荐

引言 在 AI 营销成为企业流量争夺关键赛道的当下,GEO 服务对企业品牌在 AI 语境中树立良好形象、获取竞争优势意义重大。为给企业提供可靠的合作参考,本次 2025 年贵阳 GEO 厂商推荐榜,由中国地理信息产业协会、中国…

2025年五大知名的西点培训学校推荐,看哪家收费合理?

在烘焙行业蓬勃发展的当下,掌握专业西点技艺成为许多人就业创业的敲门砖。面对市场上琳琅满目的西点培训学校,如何找到知名的西点培训学校、高性价比的西点培训学校?以下依据教学品质、口碑评价与性价比维度,为你推…

CSP-S2025游记

初赛 9.19 被CPP强行提早一天会学校,遂不爽。 被猫学长投喂了麻薯,拜谢猫学长%%%。 做了2020年真题,90.5pts,赢。 晚上整个寝室楼都只有OIer,为什么其它竞赛一个赛季那么短? 9.20 因为学校压根就没什么人,所以七…

详细介绍:【Nacos】集群搭建和配置实战攻略

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年五大郑州木头包装箱厂排行榜,口碑好的托盘包装箱生产

为帮助企业精准锁定适配自身需求的包装合作伙伴,避免选型陷入价格战陷阱或合规风险盲区,我们从资质合规性(如危险品包装认证、IPPC检疫资质)、技术解决方案能力(含特殊场景包装设计、成本优化方案)、交付响应效率…

Memoirs and Experience Summarise: to my OI career

【咕咕咕】 我什么也不知道。不知道,这一年真真切切提高的分数和排名,为什么会是这个结果。无所谓了。才考完想发泄一下情绪,于是有了这么个东西,当时也没写多少。 然后我爸看到之后催我赶紧写完???Leisure wri…

希腊移民企业推荐,比较好的希腊移民公司与希腊移民资深企业全解

在全球化浪潮下,希腊购房移民凭借低门槛、高性价比的优势,成为不少家庭布局欧洲的优选路径。然而,市场上移民机构鱼龙混杂,如何找到比较好的希腊移民公司、靠谱的希腊移民企业和希腊移民资深企业?以下依据专业度、…

2026 太原 KET/PET 辅导机构口碑排名:权威测评

在太原小店区、迎泽区、杏花岭区、尖草坪区、万柏林区、晋源区、清徐县、阳曲县、娄烦县、古交市,每到孩子备战 KET/PET 的阶段,家长们是不是都在为找靠谱的课外补习机构操碎了心?想选一家有权威机构资质的,却被五…

2025 年最新推荐不锈钢水箱源头厂家榜单:覆盖多场景需求,附国内协会测评数据与优质厂商详情不锈钢保温水箱/304 不锈钢水箱/不锈钢消防水箱/不锈钢人防水箱/组合式不锈钢水箱公司推荐

引言 当前不锈钢水箱市场需求旺盛,但行业乱象频发。据中国建筑金属结构协会 2025 年《不锈钢水箱行业质量白皮书》显示,市场上 38% 的不锈钢水箱存在材质不达标问题,非食品级不锈钢占比超 25%;工艺不合格导致的水箱…

Avira优化器本地权限提升漏洞深度剖析

本文详细披露了Avira优化器中的一个本地权限提升漏洞。该漏洞源于Avira.OptimizerHost.exe服务以SYSTEM权限运行且通过不安全的命名管道接收命令,攻击者可通过代码注入和证书克隆绕过验证,实现从普通用户到SYSTEM权限…

详细介绍:DocxFactory: 一个C++操作word的开源库(不依赖office控件)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

页分裂 页合并(索引为什么会慢慢膨胀)

🔥 一句话总纲B+Tree 就像图书馆书架:书(行)放满了一格(页) → 再放就得搬书、再开新格 → 结构调整就是页分裂/合并。1️⃣ B+Tree 页结构回顾 每个页(Page):默认大小 16KB 叶子节点存索引列 + 行指针(或全…

解读上海中臻达建设有限公司的品牌知名度、口碑与合作伙伴

在钢结构建筑领域,上海中臻达建设有限公司的名字逐渐被更多人所熟知。许多人都十分关心中臻达的品牌知名度如何、口碑好不好以及它的合作伙伴有哪些。接下来,就让我们深入了解这家公司。 行业优势:技术创新与全周期…

走出线性陷阱:重构信息化与数字化的非连续性关系 ——基于范式差异与转型路径的再思考

当前企业界普遍沿用“信息化—数字化—智能化”的三步走线性叙事,将传统信息化视为数字化转型的必然前置工程。本文基于战略管理实践、企业信息系统演进及行业案例观察指出:信息化与数字化在问题意识、技术架构与业务…

【小工具】详细比较微信小程序的 onLoad 和 onShow

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年度防撞板工厂直供TOP5专业厂家测评:甄选佛山头部

在公装、家装装饰材料领域,防撞板因兼具防护与装饰属性,成为医院、学校、酒店、写字楼等场景的刚需材料。2024年数据显示,国内防撞板市场规模突破60亿元,年增速达28%,但行业痛点突出:30%的投诉集中在交付延迟、环…

2026 石家庄 KET/PET 课外教育机构口碑排行榜:权威测评推荐

在石家庄长安区、桥西区、新华区、裕华区、井陉矿区、藁城区、鹿泉区、栾城区、井陉县、正定县、行唐县、灵寿县、高邑县、深泽县、赞皇县、无极县、平山县、元氏县、赵县、辛集市、晋州市、新乐市的家长们,你是不是也…

2025论文降重降AI神器终极对决!用学术猹,AI率轻松降至个位数!

2025论文降重降AI神器终极对决!用学术猹,AI率轻松降至个位数!随着2025年学术审查标准的全面升级,论文不仅需要通过传统的重复率检测,更要面临严格的AIGC生成痕迹筛查。选择一款能同时应对“查重”与“查AI”双重考…