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

简介: 【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )

引言

本文将深入探讨使用套接字进行网络通信的基本步骤,包括创建套接字、绑定地址、监听连接(对于服务器端)、连接远程主机(对于客户端)、以及发送和接收数据等操作。套接字编程涉及一系列系统调用和函数,如 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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

463616276ff04735b0a4d200bb79d06e.png

目录
相关文章
|
1月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
235 17
|
1月前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
76 13
|
1月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
77 18
|
3月前
|
存储 安全 Linux
7个设置/获取接口了解Linux时间管理
本文系统介绍了Linux时间管理中的7个关键设置/获取接口,涵盖时间获取(如`time`、`gettimeofday`、`clock_gettime`)、时间设置(如`stime`、`settimeofday`、`clock_settime`)以及时间转换和格式化等内容。文章详细解析了绝对时间和相对时间的概念,包括GMT、UTC及本地时间的区别,并通过实例测试展示了各接口的使用方法与特性。此外,还探讨了时区设置对时间计算的影响,强调在实际开发中推荐使用UTC作为基准时间以避免时区变化带来的问题。总结部分结合项目经验,提醒开发者注意时间服务的重要性及潜在风险,例如时间跳跃可能引发的应用故障。
126 45
7个设置/获取接口了解Linux时间管理
|
1月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
89 10
|
3月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
3月前
|
消息中间件 监控 算法
用Apifox调试Socket.IO接口,从原理到实践
传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时通信框架的价值所在。
用Apifox调试Socket.IO接口,从原理到实践
|
3月前
|
JSON 测试技术 网络安全
如何调试 Socket.IO 接口?图文教程
Socket.IO 是一个用于实现低延迟、双向和基于事件通信的库,广泛应用于实时应用开发中。有效测试 Socket.IO 接口对于确保应用稳定性和功能正确性至关重要。本文介绍如何使用 Apifox 轻松进行 Socket.IO 接口测试,包括新建接口、监听事件、发送消息、配置握手参数、使用变量、保存和共享接口等步骤。Apifox 操作简便、功能完善,是开发者调试 Socket.IO 接口的得力助手,帮助确保实时通信的可靠性和稳定性,提高开发效率。
|
4月前
|
存储 Linux
linux中的目录操作函数
本文详细介绍了Linux系统编程中常用的目录操作函数,包括创建目录、删除目录、读取目录内容、遍历目录树以及获取和修改目录属性。这些函数是进行文件系统操作的基础,通过示例代码展示了其具体用法。希望本文能帮助您更好地理解和应用这些目录操作函数,提高系统编程的效率和能力。
245 26
|
4月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
91 26

热门文章

最新文章