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

网络: 套接字

套接字: 在网络上进行进程间通信

网络字节序与主机字节序的转化

sockaddr

sockaddr

struct sockaddr {sa_family_t sa_family; // 地址族char        sa_data[14]; // 地址数据,具体内容与地址族相关
};

sockaddr_in :主要是地址类型, 端口号, IP地址. 基于IPv4编程时, 使用的数据结构sockaddr_in

struct sockaddr_in {sa_family_t    sin_family;  // 地址族,通常为 AF_INETin_port_t      sin_port;    // 端口号,网络字节顺序struct in_addr sin_addr;    // IPv4 地址结构char           sin_zero[8]; // 无用字段,通常用零填充
};struct in_addr {in_addr_t s_addr; // IPv4 地址,32 位无符号整数,网络字节顺序
};

地址转换函数

字符串转in_addr的函数

in_addr转字符串的函数

sock常见API

头文件: <sys/socket.h>  <netinet/in.h>  <arpa/inet.h>  <sys/types.h>// 创建 socket 文件描述符(TCP/UDP, 客户端 + 服务器) (返回一个套接字描述符,失败返回 -1)
int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器) (成功绑定返回 0,失败返回 -1)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);// 开始监听socket (TCP, 服务器) (成功返回 0,失败返回 -1)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器) (成功返回一个套接字描述符,失败返回 -1)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);// 建立连接 ((TCP, 客户端) (成功返回0, 失败返回-1)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);//关闭文件描述符 (成功返回 0, 失败返回-1)
close(sockfd);
// 发送数据 (TCP/UDP) (返回发送的字节数,失败返回 -1)
ssize_t send(int sockfd, const void *buf, size_t len, int flags);// 接收数据 (TCP/UDP) (返回接收的字节数,失败返回 -1)
ssize_t recv(int sockfd, void *buf, size_t len, int flags);// 发送数据到指定目标 (UDP)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);// 接收数据并记录发送端地址信息 (UDP)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

TCP套接字

  • 客户端
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() 
{int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 1.创建套接字 (-1表示失败)sockfd = socket(AF_INET, SOCK_STREAM, 0);// 设置服务器地址信息server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080); // 服务器端口server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器 IP 地址// 2.连接服务器 connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));// 3.发送数据send(sockfd, "Hello, server!", strlen("Hello, server!"), 0);// 4.接收数据recv(sockfd, buffer, sizeof(buffer), 0);printf("Server says: %s\n", buffer);// 5.关闭套接字close(sockfd);return 0;
}
  • 服务端
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main() 
{int sockfd, newsockfd;struct sockaddr_in server_addr, client_addr;socklen_t client_len;char buffer[1024] = "Hello, client!";// 1.创建套接字 (-1表示失败)sockfd = socket(AF_INET, SOCK_STREAM, 0);// 设置服务器地址信息server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);       // 监听端口server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口// 2.绑定端口(-1表示失败)bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)// 3.监听连接(-1表示失败)listen(sockfd, 5);// 4.接受连接(-1表示失败)client_len = sizeof(client_addr);newsockfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);// 5.接收数据recv(newsockfd, buffer, sizeof(buffer), 0);printf("Client says: %s\n", buffer);// 6.发送数据send(newsockfd, "Hello, client!", strlen("Hello, client!"), 0);// 7.关闭连接close(newsockfd);close(sockfd);return 0;
}

UDP套接字

  • 客户端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>#define SERVER_IP "127.0.0.1"
#define PORT 12345
#define MAX_LINE 100int main() {int sockfd;struct sockaddr_in server_addr;char buffer[MAX_LINE];socklen_t server_len;ssize_t bytes_sent, bytes_received;// 1.创建套接字(返回值 < 0 表示失败)sockfd = socket(AF_INET, SOCK_DGRAM, 0);// 设置服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);//将一个文本格式的 IPv4 或 IPv6 地址转换为网络字节序(大端序)的二进制形式inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr);// 发送数据 (返回值 < 0 表示失败)char *message = "Hello, server!";server_len = sizeof(server_addr);bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&server_addr, server_len);// 接收数据 (返回值< 0 表示出错)bytes_received = recvfrom(sockfd, buffer, MAX_LINE, 0, NULL, NULL);buffer[bytes_received] = '\0';printf("Received from server: %s\n", buffer);// 关闭套接字close(sockfd);return 0;
}
  • 服务端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>#define PORT 12345
#define MAX_LINE 100int main() 
{int sockfd;struct sockaddr_in server_addr, client_addr;char buffer[MAX_LINE];socklen_t client_len;ssize_t bytes_received, bytes_sent;// 1.创建套接字sockfd = socket(AF_INET, SOCK_DGRAM, 0);// 设置服务器地址memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htonl(INADDR_ANY);server_addr.sin_port = htons(PORT);// 2.绑定端口bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));// 3.接收数据client_len = sizeof(client_addr);bytes_received = recvfrom(sockfd, buffer, MAX_LINE, 0, (struct sockaddr *)&client_addr, &client_len);buffer[bytes_received] = '\0';// 4.发送数据char *message = "Hello, client!";bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&client_addr, client_len);// 5.关闭套接字close(sockfd);return 0;
}

相关文章:

网络: 套接字

套接字: 在网络上进行进程间通信 网络字节序与主机字节序的转化 sockaddr sockaddr struct sockaddr {sa_family_t sa_family; // 地址族char sa_data[14]; // 地址数据&#xff0c;具体内容与地址族相关 };sockaddr_in :主要是地址类型, 端口号, IP地址. 基于IPv4编程…...

Day57-Nginx反向代理与负载均衡初步应用

Day57-Nginx反向代理与负载均衡初步应用 1. Nginx代理介绍2. Nginx代理常见模式2.1 正向代理2.2 反向代理2.3 正向与反向代理区别 3. Nginx代理支持协议4. Nginx反向代理场景实践5. lb01安装部署nginx 1. Nginx代理介绍 1&#xff09;在没有代理的情况下&#xff0c;都是客户端…...

【PHP】通过PHP开启/暂停Apache、MySQL或其他服务

目录 一、前言 二、代码 一、前言 有些时候我们需要开启或暂停一些服务&#xff0c;比如说开启Apach或暂停MySQL服务等&#xff0c;最近工作中也开发了这方面的功能&#xff0c;记录下来怎样使用PHP语言来开启或暂停Apache、MySQL服务的运行状态。 这种方法也适用其他服务。…...

JAVA中spring介绍

Spring框架是一个开源的Java平台&#xff0c;它最初由Rod Johnson于2003年创建&#xff0c;目的是简化企业级应用的开发。Spring框架的核心特性包括控制反转&#xff08;IoC&#xff09;、面向切面编程&#xff08;AOP&#xff09;、事务管理、数据访问等。它通过提供一套综合的…...

latex下载与安装

用jupyter导出pdf时&#xff0c;需要用到Tex 1.Tex下载安装 官网 直接git下载 git clone https://github.com/latex3/latex2e.git 或者 清华大学开源软件镜像 双击.bat文件 大概需要1-2小时&#xff0c;如果安装失败&#xff0c;重新进行安装 查看是否安装成功&#xff…...

JavaParser 手动安装和配置

目录 前言 一、安装 Maven 工具 1.1 Maven 软件的下载 1.2 Maven 软件的安装 1.3 Maven 环境变量配置 1.4 通过命令检查 Maven 版本 二、配置 Maven 仓库 2.1 修改仓库目录 2.2 添加国内镜像 三、从 Github 下载 JavaParser 3.1 下载并解压 JavaParser 3.2 从路径打…...

再次度过我的创作纪念日

机缘 写博客的机缘巧合已经在上一篇博客中写到了&#xff0c;至于收获和成就也不一一赘述了。想和大家聊的呢就这最近这一年左右的经历吧 日常 自从2022年开始&#xff0c;入职了一家大型的项目外派公司&#xff0c;名字就不说了。开始了我的保险公司系统的开发工作。工作地点…...

云电脑火爆出圈,如何选择和使用?--腾讯云、ToDesk云电脑、青椒云使用评测和攻略

前言&#xff1a; Hello大家好&#xff0c;我是Dream。在当下&#xff0c;科技的飞速发展已经深入影响着我们的日常生活&#xff0c;特别是随着物联网的兴起和5G网络的普及&#xff0c;云计算作为一个重要的技术概念也逐渐走进了我们的视野。云计算早已不再是一个陌生的名词&am…...

webpack原理之-打包流程热更新HMR

webpack打包流程&#xff1f; 1. 初始化: 启动构建&#xff0c;读取与合并配置参数&#xff0c;加载Plugin&#xff0c;实例化Compiler&#xff1b; 2. 编译: 从 entry出发&#xff0c;针对每个 Module 串行调用对应的 loader 去翻译文件的内容&#xff0c;再找到该 Module 依赖…...

SELinux详解

文章目录 SELinux详解什么是SELinux当初设计的目标&#xff1a;避免资源的误用传统的文件权限与账号主要的关系&#xff1a;自主访问控制(DAC)以策略规则制定特定进程读取特定文件&#xff1a;强制访问控制(MAC) SELinux的运行模式安全上下文进程与文件SELinux类型字段的相关性…...

Go语言实现SSE中转demo

Go语言实现SSE中转demo 文章概要&#xff1a;本文主要通过一个demo来介绍如何使用Go语言实现SSE中转。 本文内容来自&#xff1a;谷流仓AI - ai.guliucang.com 前提 已安装Go语言环境&#xff08;参考这篇文章:Macbook安装Go以及镜像设置&#xff09; 创建项目 创建项目目录…...

国内IP修改软件下载指南

在互联网时代&#xff0c;IP地址扮演了一个非常重要的角色。国内IP修改成为一些用户迫切需求的问题&#xff0c;因为它可以帮助用户解决一些特定的网络访问问题。那么&#xff0c;要修改国内IP地址&#xff0c;我们该使用哪些软件呢&#xff1f;虎观代理小二将为大家列举几款可…...

模数转换器 SIG1230A 国产平替 ADS1230,替代 ADS1230

信格勒微电子的芯片产品已通过行业头部大厂导入验证&#xff0c;深受百万终端客户好评。 而且因为 fully compatible. 板子拿来&#xff0c;换个芯片&#xff0c; 性能更好 。MCU不用改 c code。 SIG1230A 10/80SPS 20-bit ADC with PGA Compatible Parts ADS1230 fully…...

获取淘宝商品评论的爬虫技术分享(已封装API,可测试)

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…...

由vue2版本升级vue3版本遇到的问题

一、vuedraggable 由vue2版本升级vue3版本后&#xff0c;可能会遇到以下几种bug&#xff1a; 1、vue3vuedraggable报错TypeError: Cannot read properties of undefined (reading ‘updated’)&#xff1a;这个一般是因为插件使用语法有问题&#xff0c;vue3版本的插件使用时&…...

数据挖掘终篇!一文学习模型融合!从加权融合到stacking, boosting

模型融合&#xff1a;通过融合多个不同的模型&#xff0c;可能提升机器学习的性能。这一方法在各种机器学习比赛中广泛应用&#xff0c; 也是在比赛的攻坚时刻冲刺Top的关键。而融合模型往往又可以从模型结果&#xff0c;模型自身&#xff0c;样本集等不同的角度进行融合。 数据…...

24考研数学炸了,给25考研人的启示

复习原则和要素 在选择老师、思路的时候&#xff0c;一定要看清楚&#xff0c;认不认可这个老师的复习思路。 有的老师认为大家基础不错&#xff0c;讲的内容可能不会特别细致。有的老师注重基础&#xff0c;讲的很细致&#xff0c;防止0基础的学生吃力。所以&#xff0c;思路…...

嵌入式学习第三十天!(单向链表练习)

1. 单向链表的逆序&#xff1a; int Is_Empty_Link(LINK_LIST *plist) {return plist->phead NULL; }void Reverse_Link(LINK_LIST *plist) {LINK_NODE *ptmp plist->phead;LINK_NODE *pinsert NULL;plist->phead NULL;if(Is_Empty_Link(plist)){return;}else{wh…...

Linux:rpm部署Jenkins(1)

1.获取Jenkins安装包 我这里使用的是centos7系统&#xff0c;ip为&#xff1a;192.168.6.6 2G运存 连接外网 Jenkins需要java环境&#xff0c;java的jdk包你可以去网上下载离线包&#xff0c;或者直接去yum安装&#xff0c;我这里使用的是yum安装 再去获取Jenkins的rpm包…...

新能源汽车充电桩站点烟火AI识别检测算法应用方案

新能源汽车作为现代科技与环保理念的完美结合&#xff0c;其普及和应用本应带给人们更加便捷和绿色的出行体验。然而&#xff0c;近年来新能源汽车充电火灾事故的频发&#xff0c;无疑给这一领域投下了巨大的阴影。这不禁让人深思&#xff0c;为何这一先进的交通工具在充电过程…...

如何通过Diablo Edit2高效定制暗黑破坏神II角色?全攻略指南

如何通过Diablo Edit2高效定制暗黑破坏神II角色&#xff1f;全攻略指南 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾因暗黑破坏神II中属性点分配错误而重开新角色&#xff1f;是否为刷…...

抖音内容下载技术方案:多策略架构与智能下载引擎实现

抖音内容下载技术方案&#xff1a;多策略架构与智能下载引擎实现 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

别再手动输路径了!用VS Code Remote-WSL一键直达Ubuntu 20.04的home目录

极速直达WSL开发环境&#xff1a;VS Code高效工作流全指南 每次在Windows和WSL之间来回切换路径&#xff0c;就像在两个平行宇宙间手动搭建桥梁。作为深度使用WSL的开发者&#xff0c;我经历过无数次在资源管理器地址栏手输\\wsl$的痛苦&#xff0c;也曾在终端反复cd到项目目录…...

从洛伦兹吸引子到三体问题:用Python RK45方法探索混沌与天体物理的奇妙世界

从洛伦兹吸引子到三体问题&#xff1a;用Python RK45方法探索混沌与天体物理的奇妙世界 混沌系统与天体运动看似毫不相关&#xff0c;却共享着对初始条件极度敏感的数学本质。1963年&#xff0c;气象学家爱德华洛伦兹在简化大气对流模型时&#xff0c;意外发现了"蝴蝶效应…...

R语言新手必看:ggplot2安装失败的5种常见原因及解决方法(附完整代码)

R语言ggplot2安装问题全解析&#xff1a;从报错排查到可视化实战 第一次接触R语言的ggplot2包时&#xff0c;那种兴奋和期待往往会被突如其来的报错信息浇灭。作为R社区最受欢迎的数据可视化工具&#xff0c;ggplot2以其优雅的语法和强大的定制能力吸引了无数用户&#xff0c;但…...

手把手教你用STM32F103C8T6+DHT11做个智能加湿器(附完整代码和PCB文件)

从零打造智能加湿器&#xff1a;STM32F103C8T6与DHT11的完美组合 在干燥的秋冬季节&#xff0c;一台能够自动调节湿度的智能加湿器不仅能提升生活舒适度&#xff0c;更是电子爱好者展示技能的绝佳项目。本文将带你从元器件选型开始&#xff0c;逐步完成一个基于STM32F103C8T6单…...

Pixel Couplet Gen基础教程:Streamlit+ModelScope零配置环境搭建步骤详解

Pixel Couplet Gen基础教程&#xff1a;StreamlitModelScope零配置环境搭建步骤详解 1. 项目介绍与准备 Pixel Couplet Gen是一款融合了传统春节文化与现代像素艺术风格的AI春联生成器。它基于ModelScope大模型驱动&#xff0c;通过Streamlit构建了独特的8-bit复古游戏界面&a…...

阿博图书馆管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否&#xff0c;咱们都是朋友&#xff0c;能帮的地方我绝不含糊。买卖不成仁义在&#xff0c;这就是我的做人原则。摘要 在信息化时代背景下&#xff0c;图书馆作为知识传…...

【TCC从理论到亿级支付系统落地】:7个真实生产环境故障复盘+可直接套用的补偿模板

第一章&#xff1a;TCC分布式事务的核心原理与适用边界TCC&#xff08;Try-Confirm-Cancel&#xff09;是一种基于业务层面的柔性事务模型&#xff0c;其核心在于将一个分布式事务拆解为三个明确阶段&#xff1a;资源预留&#xff08;Try&#xff09;、最终确认&#xff08;Con…...

北海穷游必吃的美食哪家好

在北海&#xff0c;海鲜饮食是城市风味的底色。从侨港风情街到南湾夜市&#xff0c;从海鲜大排档到连锁餐饮店&#xff0c;消费者对海鲜的期待始终围绕着“鲜活”“原味”“实惠”三个关键词。近年来&#xff0c;随着游客结构的变化——年轻群体、学生党、自驾家庭及宠物出行者…...