【探索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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
在这里插入图片描述

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

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

相关文章

接口自动化测试丨如何处理 Header cookie

Cookie&#xff08;复数形态&#xff1a;Cookies&#xff09;是某些网站为了辨别用户身份而储存在用户本地终端上的数据。在接口测试过程中&#xff0c;如果网站采取了 Cookie 认证的方式&#xff0c;那么发送的请求需要附带 Cookie&#xff0c;才会得到正常的响应的结果。接口…

【2024.03.05】定时执行专家 V7.1 发布 - TimingExecutor V7.1 Release

目录 ▉ 软件介绍 ▉ 新版本 V7.1 下载地址 ▉ V7.1 新功能 ▼2024-03-03 V7.1 - 更新日志 ▉ V7.0 新UI设计 ▉ 软件介绍 《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式&#x…

四 笔记本centos7.9 隧道代理

上一章 内网穿透已经可以用公网连接服务器了三 笔记本 centos7.9 内网穿透-CSDN博客 现在数据库不暴露公网的情况下怎么连接mysql 1 mysql 已经安装完毕了,这里不在介绍安装步骤 2 连接公网ip服务器或者内网ip服务器 3 配置隧道监听端口 4:测试连接

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件&#xff0c;用于在 Windows 系统上定时执行各种任务&#xff0c;包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤&#xff1a; 步骤 1: 设置 P…

Linux内存映射

目录 背景 一、什么是内存映射&#xff1f; 二、mman函数 1.权限问题 2.总线错误 3.内存权限 4.读文件内容 5.映射与文件 6.非法参数错误 7.偏移量大小 8.映射内存大小 8.1 申请6k,访问5k 8.2 申请2k&#xff0c;访问3k 8.3 返回值检查 三、内存映射实现 四…

【Unity】分拣机的数字双胞胎集成到Unity3D开发平台中

Unity HMI 一、前言 该项目的重点是通过OPC UA进行客户端-服务器通信的简单演示&#xff0c;该演示在Unity3D中实现&#xff08;服务器- B&R Automation PLC&#xff0c;客户端- Unity3D&#xff09;。该项目展示了数字孪生的分拣机与一些额外的功能。该应用程序使用多线程…

探索Web中的颜色选择:不同取色方法的实现

在Web开发中&#xff0c;提供用户选择颜色的功能是很常见的需求。无论是为了个性化UI主题&#xff0c;还是为了图像编辑工具&#xff0c;一个直观且易用的取色器都是必不可少的。本文将介绍几种在Web应用中实现取色功能的方法&#xff0c;从简单的HTML输入到利用现代API的高级技…

【DP】蓝桥杯第十三届-费用报销

#include<iostream> #include<algorithm> #include<cstring> #include<set> #include<queue> using namespace std; const int N1010; int dp[N][5010];//dp[i][j]:选到第i个物品是否能取到价值j&#xff1b; int month[13]{0,31,28,31,30,31,30…

从零开始的LeetCode刷题日记:142.环形链表II

一.相关链接 视频链接&#xff1a;代码随想录&#xff1a;142.环形链表II 题目链接&#xff1a;142.环形链表II 二.心得体会 这道题是一道链表题&#xff0c;但他没有对头结点的操作&#xff0c;所以不用虚拟头结点。这道题要分两步进行&#xff0c;第一步是判断链表有没有环…

解析医疗影像中的dicom文件

一、DICOM文件概述 我们先了解一下DICOM文件是什么&#xff0c;干嘛用的&#xff0c;以及DICOM内部有哪些信息&#xff0c;然后再谈如何去解析这些信息并转换成java对象。 医学影像学概览 医学影像学 这一学科致力于利用X射线、电磁场、超声波等多种介质与人体相互作用原理&…

力扣大厂热门面试算法题 6-8

6. Z 字形变换&#xff0c;7. 整数反转&#xff0c;8. 字符串转换整数 (atoi)&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.08 可通过leetcode所有测试用例。 目录 6. Z 字形变换 解题思路 边界条件 完整代码 Python Ja…

智慧园区综合运营数字化解决方案

1. 楼栋管理 2. 物业管理 3. 安防管理 4. 门禁管理 5. 停车管理 6. 能源管理 7. 环保管理 8. 园区生活服务 9. 招商管理 10. 收费中心 11. 园区地图 12. 门户网站 智慧园区软件方案&#xff1a;智慧园区软件解决方案&#xff0c;园区运营管理系统&#xff08;源码&#xff09;-…