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

  • 91
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 60
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yawesh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值