Linux 下网络套接字(Socket) 与udp和tcp 相关接口

文章目录

  • 1. socket常见API
  • 2 sockaddr结构体及其子类
    • 1. sockaddr结构体定义(基类)
    • 2. 子类 sockaddr_in结构体用于(IPv4)
    • 3 子类 sockaddr_un(Unix域套接字)
    • 4. 总结画出其结构体
  • 3.实现一个简单的tcp Echo 服务器和客户端(cpp)
    • 3.1 客户端
    • 3.2 服务器
    • 3.3 测试结果

1. socket常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);

  • domain:指定协议族,对于IPv4通常使用AF_INET
  • type:指定套接字类型,对于UDP使用SOCK_DGRAM
  • protocol:通常设置为0,表示使用默认协议。
  • return value: 如果成功,则返回新套接字的文件描述符。如果出现错误,则返回-1,并设置errno来指示错误。

// 绑定端口号 (TCP/UDP, 服务器)
int bind(int sockfd, const struct sockaddr *address, socklen_t address_len);

  • sockfd:套接字文件描述符。
  • sockaddr:指向sockaddr_in结构的指针,包含要绑定的IP地址和端口号。
  • address_len:地址结构的长度。

// 开始监听socket (TCP, 服务器)
int listen(int sockfd, int backlog);

  • sockfd:监听套接字的文件描述符。
  • backlog:连接队列的最大长度。

// 接收请求 (TCP, 服务器)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  • sockfd:监听套接字的文件描述符。
  • addr:用于存储接受到的连接请求的源地址(可以为NULL,如果不关心源地址)。
  • addrlen:指向源地址长度的指针(可以为NULL,如果不关心源地址长度)。
  • return value:成功时返回一个新的套接字文件描述符,用于与接受的连接进行通信;失败时返回-1并设置errno。

// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • sockfd:客户端套接字的文件描述符。
  • addr:指向服务器地址的指针。
  • addrlen:地址长度

//发送数据(TCP)

  • ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • sockfd:发送数据的套接字文件描述符。
  • buf:指向要发送的数据的指针。
  • len:数据长度。
  • flags:发送选项,通常设置为0。

//接收数据(TCP)

  • ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd:接收数据的套接字文件描述符。
  • buf:用于存储接收到的数据的缓冲区。
  • len:缓冲区长度。
  • flags:接收选项,通常设置为0。

//发送数据(UDP)

  • ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
  • sockfd:发送数据的套接字文件描述符。
  • buf:指向要发送的数据的指针。
  • len:数据长度。
  • flags:发送选项,通常设置为0。
  • dest_addr:目标地址,包含目标IP和端口号。
  • addrlen:目标地址的长度。

//接收数据(UDP)

  • ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd:接收数据的套接字文件描述符。
  • buf:用于存储接收到的数据的缓冲区。
  • len:缓冲区长度。
  • flags:接收选项,通常设置为0。
  • src_addr:用于存储源地址的指针(可以为NULL,如果不关心源地址)。
  • addrlen:指向源地址长度的指针(可以为NULL,如果不关心源地址长度)。

2 sockaddr结构体及其子类

1. sockaddr结构体定义(基类)

sockaddr
struct sockaddr 是一个通用的结构体,用于表示套接字地址。这个结构体是跨平台的,但它是抽象的,意味着它并不直接用于表示具体的地址类型(如IPv4或IPv6),而是作为一个基类,其他更具体的地址结构体(如 struct sockaddr_instruct sockaddr_in6)会基于它进行扩展。

下面是 struct sockaddr 的成员变量及其解释:

  1. sa_family_t sa_family;

    • 这是一个地址族字段,用来指示地址的类型。地址族决定了结构体中 sa_data 字段的解释方式。常见的地址族包括 AF_INET(用于IPv4地址)和 AF_INET6(用于IPv6地址)。其他可能的值还包括 AF_UNIX(用于本地套接字)等。
  2. char sa_data[14];

    • 这是一个字符数组,用于存储协议地址。对于不同的地址族,这个字段的解释方式不同。例如,对于IPv4地址(AF_INET),这个字段的前4个字节通常会被解释为一个32位的无符号整数,表示IPv4地址。然而,由于 struct sockaddr 是一个通用结构体,sa_data 字段的大小和布局可能不足以直接容纳所有类型的地址,因此在实际使用中,更具体的地址结构体(如 struct sockaddr_in)会提供额外的字段来正确存储和解释地址。

2. 子类 sockaddr_in结构体用于(IPv4)

 sockaddr_in
struct sockaddr_in 是一个结构体,这个结构体是IPv4地址和端口号的封装。下面是它的成员变量及其解释:

  1. __kernel_sa_family_t sin_family;

    • 这是一个地址族字段,用来指示地址的类型。对于IPv4地址,这个字段的值通常是AF_INET。地址族决定了结构体中其他字段的解释方式。
  2. __be16 sin_port;

    • 这个字段表示端口号,使用大端字节序(Big Endian)存储。端口号是一个16位的数字,用于区分同一台机器上的不同服务。
  3. struct in_addr sin_addr;

    • 这是一个结构体,包含了IPv4地址。struct in_addr结构体通常只包含一个32位的无符号整数,用于表示IP地址。这个整数通常使用点分十进制表示法(例如,192.168.1.1)转换为人类可读的格式。
  4. unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr)];

    • 这是一个填充字段,用于确保struct sockaddr_in的大小与更通用的struct sockaddr结构体相匹配。struct sockaddr是一个更大的结构体,设计用于包含各种不同类型的地址。__SOCK_SIZE__是一个宏,定义了struct sockaddr的大小。填充字段的大小是根据struct sockaddr的大小减去struct sockaddr_in中已知字段的大小来计算的。这样做是为了确保struct sockaddr_in可以被安全地转换为struct sockaddr,或者相反,而不会出现内存对齐或大小不匹配的问题。

3 子类 sockaddr_un(Unix域套接字)

sockaddr_un

struct sockaddr_un 是一个用于表示Unix域套接字地址的结构体。Unix域套接字是一种在同一台机器上的不同进程间进行通信的机制。与基于网络的套接字不同,Unix域套接字不涉及网络协议栈,因此它们通常具有更低的延迟和更高的带宽。

下面是 struct sockaddr_un 的成员变量及其解释:

  1. __kernel_sa_family_t sun_family;

    • 这是一个地址族字段,用于指示地址的类型。对于Unix域套接字,这个字段的值应该被设置为 AF_UNIX 或其同义词 AF_LOCAL。地址族决定了结构体中其他字段的解释方式。
  2. char sun_path[UNIX_PATH_MAX];

    • 这是一个字符数组,用于存储套接字文件的路径名。Unix域套接字可以通过文件系统路径名(也称为套接字文件)进行标识和访问。UNIX_PATH_MAX 是一个宏,定义了 sun_path 数组的最大长度,即套接字文件路径名的最大长度。这个长度在不同的系统和实现中可能有所不同,但通常足够长,可以容纳大多数文件系统路径名。

4. 总结画出其结构体

socket family

3.实现一个简单的tcp Echo 服务器和客户端(cpp)

3.1 客户端

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define PORT 12345
#define BUFFER_SIZE 1024int main() {int sock_fd;struct sockaddr_in server_addr;char buffer[BUFFER_SIZE];// 创建套接字sock_fd = socket(AF_INET, SOCK_STREAM, 0);if (sock_fd == -1) {perror("Socket creation failed");return 1;}// 配置服务器地址结构server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {perror("Invalid address");close(sock_fd);return 1;}// 连接服务器if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Connection failed");close(sock_fd);return 1;}std::cout << "Connected to server." << std::endl;// Echo 循环while (true) {std::cout << "Enter message: ";std::cin.getline(buffer, BUFFER_SIZE);if (std::strcmp(buffer, "exit") == 0) {std::cout << "Exiting..." << std::endl;break;}send(sock_fd, buffer, std::strlen(buffer), 0);memset(buffer, 0, BUFFER_SIZE);ssize_t bytes_received = recv(sock_fd, buffer, BUFFER_SIZE, 0);if (bytes_received > 0) {std::cout << "Echo from server: " << buffer << std::endl;} else {std::cout << "Server disconnected." << std::endl;break;}}close(sock_fd);return 0;
}

3.2 服务器

#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>#define PORT 12345
#define BUFFER_SIZE 1024int main() {int server_fd, client_fd;struct sockaddr_in server_addr, client_addr;char buffer[BUFFER_SIZE];socklen_t addr_len = sizeof(client_addr);// 创建套接字server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {perror("Socket creation failed");return 1;}// 配置服务器地址结构server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 绑定套接字到端口if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("Bind failed");close(server_fd);return 1;}// 监听连接if (listen(server_fd, 5) == -1) {perror("Listen failed");close(server_fd);return 1;}std::cout << "Server is listening on port " << PORT << "..." << std::endl;// 接受客户端连接client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);if (client_fd == -1) {perror("Accept failed");close(server_fd);return 1;}std::cout << "Client connected." << std::endl;// Echo 循环while (true) {memset(buffer, 0, BUFFER_SIZE);ssize_t bytes_received = recv(client_fd, buffer, BUFFER_SIZE, 0);if (bytes_received <= 0) {std::cout << "Client disconnected." << std::endl;break;}std::cout << "Received: " << buffer << std::endl;send(client_fd, buffer, bytes_received, 0);}close(client_fd);close(server_fd);return 0;
}

3.3 测试结果

test

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

跨平台WPF框架Avalonia教程 七

数据绑定 Avalonia使用数据绑定将数据从应用程序对象传递到UI控件&#xff0c;根据用户输入更改应用程序对象中的数据&#xff0c;并在响应用户命令时对应用程序对象进行操作。 在这种安排中&#xff0c;控件是绑定目标&#xff0c;而对象是数据源。 Avalonia运行数据绑定系统…

日常ctf

1&#xff0c; [陇剑杯 2021]日志分析&#xff08;问1&#xff09; %2e 为URL编码的符号 "." flag{www.zip} 2&#xff0c; [陇剑杯 2021]日志分析&#xff08;问2&#xff09; 根据之前题目的分析&#xff0c;在获取到源码文件之后&#xff0c;黑客又成功访问了in…

基于微信小程序的校园助手+LW示例参考

1.项目介绍 项目角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、寻物启事管理、物品分类管理、表白广场、吐槽大会、二手交易、拼车出行等&#xff09;、普通用户&#xff08;登录注册、寻物启事、失物招领、表白广场、吐槽大会、拼车出行…

逆向攻防世界CTF系列38-xxxorrr

逆向攻防世界CTF系列38-xxxorrr 64位无壳&#xff0c;很自然的找到main和一个比较函数 以为逻辑很简单了 enc [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46,0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0…

数据结构-堆排序笔记

1 思路 总体思路 首先我们会拿到一个无序的数组&#xff0c;我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质&#xff0c;直至大顶堆只剩下一个元素。 具体思路 首先我们先将一个…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

跨平台WPF框架Avalonia教程 六

添加交互性 用户界面的一个基本功能是与用户进行交互。在Avalonia中&#xff0c;您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。 处理事件​ Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处…

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…

药界互联:中药实验管理的网络化

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

【Linux】进程字段、环境变量与进程地址空间

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

基于isSpring的PPT转换

背景 PPT课件目前还是一项在教学中高度频繁使用的工具&#xff0c;对于在线教学就更为重要了。如何把PPT转换为在线web&#xff0c;同时保留更多的PPT特性&#xff08;动画、音效、视频&#xff09;呢&#xff1f;这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一…

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式&#xff0c;还极大地丰富了消费者的购物体验。随着技术的不断进步&#xff0c;AI在电商领域的应用越来越广泛&#xff0c;从个性…

【Linux】环境变量

目录 一、什么是环境变量: 1、系统命令搜索路径&#xff08;PATH&#xff09;&#xff1a; 2、HOME&#xff1a; 3、SHELL&#xff1a; 4、添加环境变量&#xff1a; 二、通过代码获取环境变量&#xff1a; 三、主函数参数&#xff1a; argc表&#xff1a; envp表&…

28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

密码算法简介 1.对称加密算法&#xff1a;加密和解密算法一样 2.非对称加密算法&#xff1a;公钥加密、私钥解密 3.摘要算法&#xff1a;不能解密&#xff0c;不可逆 简单介绍了解一下&#xff1a; 一、对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法…

如何用GPT-4o解读视频

OpenAI在去年推出的GPT-4V已经支持了多模态识别&#xff0c;但一直仅限于图片输入&#xff0c;不支持视频。相比之下&#xff0c;Google的Gemini早已支持视频识别。最近&#xff0c;我司业务场景中出现了一个需要识别视频的需求&#xff0c;而我们只采购了GPT-4o模型。这就引发…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面&#xff0c;有个名为vimrc 的文件&#xff0c;这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后&#xff0c;我们退出重新链接 再切换到普通用户下 再输入密码&#xff08;是不显示的&#xff0c;输入完后&#xff0c;…