一.定义

Socket(套接字)是网络编程的核心,它允许不同主机或同一主机的不同进程之间进行通信,Socket API 提供了一套标准的接口,支持 TCP、UDP、IP 等协议

分为以下三个类型:

SOCK_STREAM:
用于tcp协议,可靠、面向连接、字节流,使用场景:HTTP、FTP、SSHSOCK_DGRAM:
用于udp协议,不可靠、无连接、数据报,使用场景:DNS、视频流、游戏SOCK_RAW:
用于IP/ICMP	原始套接字(直接访问网络层),使用场景:网络嗅探、自定义协议

地址结构:

IPV4:  struct sockaddr_in

struct sockaddr_in {sa_family_t sin_family; // 地址族(AF_INET)in_port_t sin_port;// 端口号(16位,需用 htons() 转换)struct in_addr sin_addr; // IP地址(32位,需用 inet_addr() 或 htonl())char sin_zero[8]; //填充(保持与 sockaddr 大小一致)
};

IPV6:struct sockaddr_in6

通用结构:struct sockaddr

struct sockaddr {sa_family_t sa_family; //地址族(AF_INET, AF_INET6, AF_UNIX)char sa_data[14]; //实际地址数据
};

二.API接口(核心)

socket():

作用:创建套接字

//头文件:
#include <sys/socket.h>int socket(int domain,int type,int protocol);domain --- 协议族(AF_INET、AF_INET6、AF_UNIX)
type --- 套接字类型(SOCK_STREAM、SOCK_DGRAM)
protocol --- 控制,通常填 0(自动选择,如 IPPROTO_TCP)返回值:
-1 --- 创建失败
其他 --- 创建成功,并返回socketfd(套接字描述符)

举例:

#include <iostream>
#include <sys/socket.h>int socketfd = socket(AF_INET,SOCK_STREAM,0);
//检查:
if(socketfd == -1){std::cerr<<"socket creation failed"<<std::endl;exit(EXIT_FAILURE);
}
//创建成功

bind():

绑定IP和端口

//头文件:
#include <sys/socket.h>int bind(int socketfd,const struct sockaddr* addr,socklen_t addrlen);//参数:
socketfd --- 套接字描述符
addr --- 指向 sockaddr_in 或 sockaddr_in6 的指针(需强制转换)
addrlen --- 地址结构的大小(sizeof(struct sockaddr_in))//返回值:
-1 --- 绑定失败
其他(0)--- 绑定成功

举例:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;if(bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)
{ perror("bind failed");exit(EXIT_FAILURE);
}

listen():

监听连接(TCP)

#include <sys/socket.h>int listen(int sockfd,int backlog);//参数:
sockfd --- 套接字描述符
backlog --- 等待连接队列的最大长度//返回值:
-1 --- 失败
其他(0)--- 成功

举例:

if (listen(sockfd, 5) == -1) {perror("listen failed");exit(EXIT_FAILURE);
}

accept():

接收连接

#include <sys/socket.h>int accept(int sockfd,struct socketaddr* addr,socklen_t* addrlen);//参数:
sockfd --- 套接字描述符
addr --- 用于存储客户端地址
addrlen --- 地址结构大小(需先初始化)//返回值:
-1 --- 连接失败
其他 --- 连接成功,返回的是新的套接字描述符

举例:

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int connet_fd = accpet(sockfd,(struct socketaddr*)&client_addr,&client_len);
if(connet_fd == -1)
{perror("accept failed");exit(EXIT_FAILURE);
}
//连接成功

connect():

用户向服务器发起连接

#include <sys/socket.h>int connect(int sockfd,const struct sockaddr *addr, socklen_t addrlen);//参数:
sockfd --- 套接字描述符
addr --- 服务器地址
addrlen --- 地址结构大小//返回值:
-1 --- 连接失败
其他(0)--- 连接成功

举例:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htos(8080);
//解析IP:
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); //连接并判断:
if(connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) == -1)
{perror("connect failed");exit(EXIT_FAILURE);
}
//连接成功

send/recv:

TCP数据收发

#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);//buf内容要填充的,不能用const//参数:
sockfd --- 已连接的套接字
buf --- 数据缓冲区
len --- 数据长度
flags --- 可选标志(如 MSG_WAITALL 阻塞直到收满)//返回值:
-1 --- 失败
其他 --- 成功 并返回发送/接收的字节数

举例:

char buffer[1024];//缓冲区
ssize_t bytes_received = recv(connect_fd,buffer,sizeof(buffer),0);
if(bytes_received == -1)
{perror("recv failed");
}
else
{buffer[bytes_received] = '\0';  // 确保字符串终止printf("Received: %s\n", buffer);
}

sendto/recvfrom:

UDP数据收发

#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* socklen);//参数:
很多之前我们已经讲过了,讲下几个没讲的
dest_addr / src_addr --- 目标/源地址//返回值:
-1 --- 发送、接收失败
其他 --- 返回发送/接收的字节数

举例:

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[1024];
ssize_t bytes_recvfrom = recvfrom(sockfd,buffer,sizeof(buffer),0,(struct sockaddr*)&client_addr,&client_len);
if(bytes_recvfrom == -1)
{perror("recvfrom failed");
}
//接收成功

close()

关闭套接字

#include <unistd.h>//Linux系统下:
int close(int sockfd);//补充:Windows系统下
#incluide <winsock2.h>
int closesocket(SOCKET sockfd);//也是关闭连接,但是可以自己选择
int shutdown(int sockfd, int how);//参数:
how --- 1.SHUT_RD:关闭读取    2.SHUT_WR:关闭写入    3.SHUT_RDWR:完全关闭

掌握这些 API 后,你可以实现基本的 TCP 服务器/客户端 和 UDP 通信了

最后,感谢你的支持!!!

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

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

相关文章

如何实现打印功能

一、AI赋能提供思路基本框架<!-- 隐藏的打印内容&#xff08;默认不显示&#xff09; --> <div id"print-container" style"display: none;"><h1>退货单打印内容</h1><table><!-- 打印专用的表格结构 --></table&g…

Android 架构演进:从 MVC 到 MVVM 的设计之道

在 Android 开发初期&#xff0c;很多开发者会把所有逻辑塞进 Activity—— 网络请求、数据处理、UI 更新全堆在一起&#xff0c;导致代码超过数千行&#xff0c;改一个按钮点击都要翻半天。这种 “面条式代码” 的根源是缺乏架构设计。随着应用复杂度提升&#xff0c;MVC、MVP…

使用 gh-pages 将 next.js15 静态项目部署到 github pages

以下我使用 next.js15 写的 Todo List 为例,假设我们本地已经存在一个 next.js15 的 Todo List 项目。 说明:解决了项目部署到 github pages 后访问不到 css、js、字体以及访问不到 public 目录下的图片问题。 第一步 安装 gh-pages: npm i gh-pages第二步 在 public 目…

rename系统调用及示例

21. rename - 重命名文件或目录 函数介绍 rename系统调用用于重命名文件或目录&#xff0c;也可以将文件或目录移动到另一个位置。如果目标文件已存在&#xff0c;则会被替换。 函数原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 将…

PHP框架之Laravel框架教程:3. 数据库操作(简要)

3. 数据库操作&#xff08;简要&#xff09; 配置 数据库的配置文件在 config/database.php 文件中&#xff0c;你可以在这个文件中定义所有的数据库连接配置&#xff0c;并指定默认的数据库连接。这个文件中提供了大部分 Laravel 能够支持的数据库配置示例。 mysql > [driv…

项目七.AI大模型部署

环境准备此处使用的是rock linux8.9操作系统k8s集群三个设备&#xff0c;使用centos7.9操作系统设备配置##上传ollama工具的压缩包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…

Oracle 19C RU 19.28 升级和安装

背景介绍 概述 本次升级包括安全漏扫中所有19c数据库,漏扫预警版本19.3到19.27各个版本,数据库需要升级至19.28版本满足安全要求。 原端19C 升级目标端19.28 db_name racdb racdb ORACLE_SID racdb1/2 racdb1/2 ORACLE_HOME GI:/oracle/asm DB:/oracle/db GI:/orac…

嵌入式学习日志————对射式红外传感器计次

前言这是第二次学习这部分内容了&#xff0c;第一次是大一上学期&#xff0c;因为大二下忙着其他事一直没来得及吧STM32学完&#xff0c;所以假期从头开始再学&#xff0c;比第一次也有了更深的理解&#xff0c;以下内容均是看【STM32入门教程-2023版 细致讲解 中文字幕】https…

ONLYOFFICE深度解锁系列.13-如何复制、重新排序 PDF 页面:onlyoffice 9.0.3 新功能

在处理合同、讲义、研究资料或扫描文档时&#xff0c;保持页面顺序井然尤为重要。有时文件页数繁多、排序混乱或缺少逻辑&#xff0c;这不仅影响阅读体验&#xff0c;也不利于后续使用或分享。好消息是&#xff0c;借助 ONLYOFFICE PDF 编辑器&#xff0c;您可以轻松拖拽页面&a…

vue递归树形结构删除不符合数据 生成一个新数组

首先看一下数据结构&#xff08;我的是路由菜单&#xff09;{"code": 200,"message": "请求成功!","success": true,"data": [{"startDate": null,"endDate": null,"createTime": "2023…

【机器学习之推荐算法】基于K最近邻的协同过滤推荐与基于回归模型的协同过滤推荐

基于K最近邻的协同过滤推荐 基于K最近邻的协同过滤推荐其实本质上就是MemoryBased CF&#xff0c;只不过在选取近邻的时候&#xff0c;加上K最近邻的限制。 这里我们直接根据MemoryBased CF的代码实现 修改以下地方 class CollaborativeFiltering(object):based Nonedef __ini…

望言OCR视频字幕提取2025终极评测:免费版VS专业版提全方位对比(含免费下载)

大家好&#xff0c;欢迎来到程序视点&#xff01;我是你们的老朋友.小二&#xff01;一、产品定位&#xff1a;AI时代的视频字幕处理专家望言OCR作为专业的视频硬字幕提取工具&#xff0c;在AI视频处理领域占据重要地位。最新评测显示&#xff0c;其免费版本依然保持着惊人的97…

Matplotlib(二)- Matplotlib简单绘图

文章目录一、pyplot模块介绍二、Matplotlib简单绘图1. 绘制折线图1.1 折线图介绍1.2 plt.plot()函数介绍1.3 绘制简单折线图1.3.1 绘制单条折线图1.3.2 绘制多条折线图1.4 示例&#xff1a;绘制天气气温折线图2. 绘制柱形图2.1 柱形图介绍2.2 plt.bar()函数介绍2.3 绘制柱形图2…

【世纪龙科技】数字化技术解锁新能源汽车电驱动总成装调与检修

随着新能源汽车产业加速升级&#xff0c;电驱动总成装调与检修技术已成为职业院校汽车专业教学的核心挑战。传统实训模式面临设备投入高、更新周期长、高压操作安全隐患多、教学与产业需求脱节等现实问题&#xff0c;导致学生实践能力培养滞后于行业发展。如何通过数字化手段突…

springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现

用户&#xff1a;注册&#xff0c;登录&#xff0c;健身教练&#xff0c;健身课程&#xff0c;健身器材&#xff0c;健身资讯&#xff0c;课程报名管理&#xff0c;教练预约管理&#xff0c;会员充值管理&#xff0c;个人中心管理员&#xff1a;登录&#xff0c;个人中心&#…

如何修改debian的ip地址

编辑配置文件&#xff1a; sudo nano /etc/network/interfaces修改内容&#xff08;示例将 eth0 设为静态IP&#xff09;&#xff1a; auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4 #…

haproxy七层代理(知识点+相关实验部署)

目录 1.负载均衡介绍 1.1 什么是负载均衡 1.2 为什么用负载均衡 1.3 负载均衡类型 1.3.1 四层负载均衡 1.3.2 七层负载均衡 1.3.3 四层和七层的区别 2.haproxy简介 2.1 haproxy主要特性 2.2 haproxy的优点与缺点 3.haproxy的安装和服务信息 3.1 实验环境 3.1.1 hap…

【集合】JDK1.8 HashMap 底层数据结构深度解析

一、核心数据结构&#xff1a;为什么是 "数组 链表 红黑树"&#xff1f;​HashMap 的底层设计本质是用空间换时间&#xff0c;通过哈希表的快速定位特性&#xff0c;结合链表和红黑树处理冲突&#xff0c;平衡查询与插入效率。​1.1 基础容器&#xff1a;哈希桶数组…

【element-ui】HTML引入本地文件出现font找不到/fonts/element-icons.woff

文章目录目录结构问题复现解决办法目录结构 |-web|- public|- lib|- ...|- index.htmlindex.html <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import CSS --><link rel"stylesheet" href"./public/…

Windows|CUDA和cuDNN下载和安装,默认安装在C盘和不安装在C盘的两种方法

本篇文章将详细介绍在Windows操作系统中配置CUDA和cuDNN的步骤。通过本教程&#xff0c;您将能够轻松完成CUDA和cuDNN的安装、环境变量配置以及与深度学习框架&#xff08;如TensorFlow和PyTorch&#xff09;兼容性测试&#xff0c;从而为您的深度学习项目提供强大的硬件支持。…