【探索Linux】—— 强大的命令行工具 P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )

在这里插入图片描述

阅读导航

  • 引言
  • 一、socket 常见API表
  • 二、函数详细介绍
      • 01. socket()
      • 02. bind()
      • 03. listen()
      • 04. accept()
      • 05. connect()
      • 06. send()
      • 07. recv()
      • 08. close()
      • 09. select()
      • 10. getaddrinfo()
      • 11. sendto()
      • 12. recvfrom()
      • 13. setsockopt()
      • 14. getsockopt()
      • 15. shutdown()
      • 16. inet_pton()
      • 17. htons() / htonl() / ntohs() / ntohl()
  • 温馨提示

引言

本文将深入探讨使用套接字进行网络通信的基本步骤,包括创建套接字、绑定地址、监听连接(对于服务器端)、连接远程主机(对于客户端)、以及发送和接收数据等操作。套接字编程涉及一系列系统调用和函数,如 socket()bind()listen()connect()send()recv() 等。开发人员可以利用这些接口实现各种网络应用。通过本文,读者将了解如何使用套接字进行网络通信,并掌握关键步骤和函数调用,为构建网络应用打下坚实基础。

一、socket 常见API表

函数描述
socket()创建一个新的套接字
bind()将套接字绑定到特定的IP地址和端口号上
listen()将套接字标记为被动套接字,用于监听连接请求
accept()接受客户端的连接请求,并返回一个新的套接字用于通信
connect()建立与服务器端的连接
send()发送数据
recv()接收数据
sendto()用于UDP协议中发送数据
recvfrom()用于UDP协议中接收数据
close()关闭套接字连接
select()多路复用,同时监视多个套接字的状态
getaddrinfo()主机名和服务名之间的转换
setsockopt()设置套接字选项
getsockopt()获取套接字选项的值
inet_pton()IP地址的转换
inet_ntop()IP地址的转换
htons()主机字节序和网络字节序之间的转换(16位整数)
ntohs()主机字节序和网络字节序之间的转换(16位整数)
htonl()主机字节序和网络字节序之间的转换(32位整数)
ntohl()主机字节序和网络字节序之间的转换(32位整数)

二、函数详细介绍

01. socket()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int socket(int domain, int type, int protocol);

  • 参数类型

    • domain:协议族(如AF_INET、AF_INET6等)
    • type:套接字类型(如SOCK_STREAM、SOCK_DGRAM等)
    • protocol:具体使用的协议(如IPPROTO_TCP、IPPROTO_UDP等)
  • 应用示例

    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    

02. bind()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • 参数类型

    • sockfd:套接字描述符
    • addr:指向要绑定的地址结构的指针
    • addrlen:地址结构的长度
  • 应用示例

    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(12345);
    server_address.sin_addr.s_addr = INADDR_ANY;
    bind(sockfd, (struct sockaddr *)&server_address, sizeof(server_address));
    

03. listen()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int listen(int sockfd, int backlog);

  • 参数类型

    • sockfd:套接字描述符
    • backlog:未完成连接队列的最大长度
  • 应用示例

    listen(sockfd, 5);
    

04. accept()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

  • 参数类型

    • sockfd:套接字描述符
    • addr:指向结构体的指针,用于存储客户端地址信息
    • addrlen:地址结构的长度
  • 应用示例

    int client_sockfd = accept(sockfd, (struct sockaddr *)&client_address, &addr_len);
    

05. connect()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • 参数类型

    • sockfd:套接字描述符
    • addr:指向要连接的目标地址结构的指针
    • addrlen:地址结构的长度
  • 应用示例

    connect(sockfd, (struct sockaddr *)&server_address, sizeof(server_address));
    

06. send()

  • 头文件:#include <sys/socket.h>

  • 函数原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);

  • 参数类型

    • sockfd:套接字描述符
    • buf:指向待发送数据的指针
    • len:待发送数据的长度
    • flags:传输控制标志
  • 应用示例

    char *message = "Hello, server!";
    send(sockfd, message, strlen(message), 0);
    

07. recv()

  • 头文件:#include <sys/socket.h>

  • 函数原型:ssize_t recv(int sockfd, void *buf, size_t len, int flags);

  • 参数类型

    • sockfd:套接字描述符
    • buf:指向存储接收数据的缓冲区
    • len:接收数据的最大长度
    • flags:接收操作的附加选项
  • 应用示例

    char buffer[1024];
    ssize_t bytes_received = recv(sockfd, buffer, 1024, 0);
    

08. close()

  • 头文件:#include <unistd.h>

  • 函数原型:int close(int sockfd);

  • 参数类型

    • sockfd:要关闭的套接字描述符
  • 应用示例

    close(sockfd);
    

09. select()

  • 头文件:#include <sys/select.h>

  • 函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

  • 参数类型

    • nfds:所有文件描述符的范围(最大文件描述符+1)
    • readfds:可读文件描述符集合
    • writefds:可写文件描述符集合
    • exceptfds:异常文件描述符集合
    • timeout:超时时间
  • 应用示例

    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(sockfd, &readfds);
    int activity = select(sockfd + 1, &readfds, NULL, NULL, NULL);
    

10. getaddrinfo()

  • 头文件:#include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>

  • 函数原型:int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);

  • 参数类型

    • node:主机名或IP地址字符串
    • service:服务名或端口号字符串
    • hints:指向地址信息结构的指针,用于设置期望的返回结果
    • res:指向存储结果的链表的指针
  • 应用示例

    struct addrinfo hints, *res;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    getaddrinfo("www.example.com", "http", &hints, &res);
    

11. sendto()

  • 头文件:#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);

  • 参数类型

    • sockfd:套接字描述符
    • buf:指向待发送数据的指针
    • len:待发送数据的长度
    • flags:传输控制标志
    • dest_addr:目标地址结构
    • addrlen:目标地址结构的长度
  • 应用示例

    char *message = "Hello, server!";
    sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&server_address, sizeof(server_address));
    

12. recvfrom()

  • 头文件:#include <sys/socket.h>

  • 函数原型:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

  • 参数类型

    • sockfd:套接字描述符
    • buf:指向存储接收数据的缓冲区
    • len:接收数据的最大长度
    • flags:接收操作的附加选项
    • src_addr:发送方地址结构
    • addrlen:发送方地址结构的长度
  • 应用示例

    char buffer[1024];
    struct sockaddr_in client_address;
    socklen_t addr_len = sizeof(client_address);
    ssize_t bytes_received = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&client_address, &addr_len);
    

13. setsockopt()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

  • 参数类型

    • sockfd:套接字描述符
    • level:选项所在的协议层
    • optname:选项名
    • optval:指向设置选项值的指针
    • optlen:选项值的长度
  • 应用示例

    int reuse = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
    

14. getsockopt()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);

  • 参数类型

    • sockfd:套接字描述符
    • level:选项所在的协议层
    • optname:选项名
    • optval:指向存储选项值的缓冲区
    • optlen:输入时为缓冲区大小,输出时为实际选项值的长度
  • 应用示例

    int buffer_size;
    socklen_t optlen = sizeof(buffer_size);
    getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffer_size, &optlen);
    

15. shutdown()

  • 头文件:#include <sys/socket.h>

  • 函数原型:int shutdown(int sockfd, int how);

  • 参数类型

    • sockfd:套接字描述符
    • how:关闭连接的方式,常用的取值为:
      • SHUT_RD:关闭读端
      • SHUT_WR:关闭写端
      • SHUT_RDWR:同时关闭读写端
  • 应用示例

    shutdown(sockfd, SHUT_RDWR);
    

16. inet_pton()

  • 头文件:#include <arpa/inet.h>

  • 函数原型:int inet_pton(int af, const char *src, void *dst);

  • 参数类型

    • af:地址族,如AF_INET(IPv4)或AF_INET6(IPv6)
    • src:待转换的点分十进制字符串形式的地址
    • dst:存储转换后的二进制格式地址的缓冲区
  • 应用示例

    struct sockaddr_in server_address;
    inet_pton(AF_INET, "127.0.0.1", &(server_address.sin_addr));
    

17. htons() / htonl() / ntohs() / ntohl()

这些函数用于主机字节序和网络字节序之间的转换,分别用于16位和32位整数的主机到网络字节序以及网络到主机字节序的转换。

  • 头文件:#include <arpa/inet.h>

  • 函数原型

    • uint16_t htons(uint16_t hostshort);
    • uint32_t htonl(uint32_t hostlong);
    • uint16_t ntohs(uint16_t netshort);
    • uint32_t ntohl(uint32_t netlong);

这些函数在实际网络编程中经常用于端口号和IP地址等数据的转换。

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust 编写新一代 Web 框架 Teo,同时支持 Node 和 Python,速度惊人!

大家好&#xff0c;我是渔夫。 今天分享主题&#xff0c;随着 Web 技术的迅速发展&#xff0c;开发变得愈发复杂&#xff0c;需要投入更多的时间和精力&#xff0c;今天介绍这款用 Rust 编写的新一代 Web 框架。 Web 项目开发越来越复杂&#xff0c;也让开发者带来很多挑战&a…

中国电子学会2021年6月份青少年软件编程Sc ratch图形化等级考试试卷四级真题

【 单选题 】 1.执行下列程序&#xff0c;输出的结果为&#xff1f; A&#xff1a;12 B&#xff1a;24 C&#xff1a;8 D&#xff1a;30 2.执行下列程序&#xff0c;角色说出的内容是&#xff1f; A&#xff1a;2 B&#xff1a;3 C&#xff1a;4 D&#xff1a;5 3.执行…

21-Java观察者模式 ( Observer Pattern )

Java备忘录模式 摘要实现范例 观察者模式 ( Observer Pattern ) 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象 观察者模式属于行为型模式 摘要 1. 意图 定义对象间的一种一对多的依赖关系&#xff…

postman的替换者postcat

手册简介 Postcat 是国产的开源 api 管理工具&#xff0c;定位小团队及个人&#xff0c;有 API 相关的核心功能&#xff0c;文档、测试、管理、mock 甚至 api 分享等等功能。 目前还在持续维护中&#xff0c;欢迎大家关注并Star 支持一下~ https://github.com/Postcatlab/post…

《C缺陷和陷阱》-笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 文章目录 前言 一、理解函数声明 1.(*(void(*)( ))0)( ); 2.signal 函数接受两个参数&#xff1a; 3.使用typedef 简化函数声明&#xff1a; 二、运算符的优先级…

【HTML】HTML基础8.1(表单标签)

目录 效果 基础知识 标签 ① ② 代码 效果 基础知识 表单的组成元素 表单控件用户所填写的信息提示信息提示用户需要填的信息表单域包含表单元素的区域 标签 ① <form action"" method""></form> <form>标签确定了一个表单域&…

Centos安装Miniconda

Centos安装Miniconda 一、前言二、安装1、下载Miniconda2、执行安装脚本3、加载环境变量使之生效&#xff1a;4、配置conda国内镜像&#xff1a; 三、conda常用命令1、创建环境2、查看所有环境3、删除一个环境4、激活指定环境5、退出当前环境 一、前言 需要在Centos中使用pytho…

吴恩达深度学习笔记:深度学习引言1.1-1.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network)1.3 神经网络的监督学习(Supervised Learning …

《数字图像处理》读书笔记

本文笔记来自——数字图像处理_第三版_中_冈萨雷斯 1.使用数字图像处理领域的实例 如果光谱波段根据光子能量进行分组&#xff0c;则可得到下图的光谱&#xff0c;范围从伽马射线&#xff08;最高能量&#xff09;到无线电波&#xff08;最低能量&#xff09;。 1.1伽马射线成…

C++学习笔记:AVL树

AVL树 什么是AVL树?AVL树节点的定义AVL树的插入平衡因子调整旋转调整左旋转右旋转左右双旋右左双旋 AVL树完整代码实现 什么是AVL树? AVL是1962年,两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis 为了解决如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找…

Mac M1:通过docker安装RocketMQ、RocketMQ-Dashboard

0. 引言 最近本地启动以前docker安装的rocketmq发现报错了&#xff0c;因为是从老mac迁移过来的&#xff0c;发现支持的芯片还是amd的&#xff0c;于是重新在docker下安装rocketmq&#xff0c;并记录下步骤&#xff0c;方便大家后续参考。 1. 步骤 1、先下载项目源码 git c…

景联文科技:专业提供高质量大语言模型训练数据

2024年&#xff0c;数字经济被再次写入政府工作报告中&#xff0c;报告指出要深化大数据、人工智能等研发应用&#xff0c;打造具有国际竞争力的数字产业集群。 大模型作为生成式人工智能的基础&#xff0c;日益成为国际科技竞争的焦点。人大代表杨剑宇指出&#xff0c;尽管我国…

货运物流小程序开发功能 发货运输更简单

随着互联网的快速发展&#xff0c;线上接单已经成为物流行业的主流趋势。货运物流接单小程序作为物流企业的得力助手&#xff0c;能够提高运输效率、降低成本、提升服务质量&#xff0c;成为物流行业的发展新方向。 1. 用户注册与登录功能&#xff1a;用户可以通过手机号、邮箱…

nodejs web服务器 -- 搭建开发环境

一、配置目录结构 1、使用npm生成package.json&#xff0c;我创建了一个nodejs_network 文件夹&#xff0c;cd到这个文件夹下&#xff0c;执行&#xff1a; npm init -y 其中-y的含义是yes的意思&#xff0c;在init的时候省去了敲回车的步骤&#xff0c;如此就生成了默认的pac…

基于Leatlet标注Geojson下载器实现

在上一篇文章中&#xff0c;我们学习了Leaflet的基础知识&#xff0c;包括如何创建地图、添加图层等。在本文中&#xff0c;我们将深入学习Leaflet中标注的创建和管理&#xff0c;包括如何添加标注、自定义标注图标、创建图层组、批量添加和删除标注、为标注添加属性和弹出框等…

二、TensorFlow结构分析(4)

TF数据流图图与TensorBoard会话张量Tensor变量OP高级API 目录 1、变量 2、高级API 1、变量 2、高级API

[嵌入式系统-37]:龙芯1B 开发学习套件 -6-协处理器CP0之CPU异常处理与外部中断控制器的中断处理

目录 一、MPIS CPU Core与32个异常exception 1.1 龙芯1B的MIPS CPU IP Core 1.2 MIP32指令系统 1.3 MIPS CPU寄存器 1.4 MIPS CPU的异常向量与异常向量号 1.5 龙芯异常exception与中断interrupt的区别 二、协议处理器CP0的中断控制与8个中断 2.1 CP0概述 2.2 协处理器…

Word文档一键转换成电子书,告别繁琐操作!

你是否曾经为了将Word文档转换为电子书而苦恼&#xff1f;手动复制粘贴、调整格式、排版等等繁琐的操作&#xff0c;不仅耗时费力&#xff0c;还容易出错。现在我教你只需轻轻一点&#xff0c;即可将Word文档轻松转换为电子书&#xff0c;无需任何手动操作 一、Word转换电子书步…

基于React低代码平台开发:直击最新应用构建

文章目录 前言一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者简介目录前言为什么要写这本书读者对象如何阅读本书 前言 随着数字化转型的…

Word论文格式怎么设置 Word论文查重功能在哪里 论文格式要求及字体大小 论文查重怎么查 WPS论文查重准确吗

Word文档是由Microsoft Word处理软件创建和编辑的文档。Word文档通常用于创建各种类型的文档&#xff0c;如信函、报告、简历、论文等。本篇文章将为大家介绍Word论文格式怎么设置以及Word论文查重功能在哪里。 一、Word论文格式怎么设置 一个好的论文格式&#xff0c;是论文…