当前位置: 首页 > article >正文

【linux网络编程】套接字编程API详细介绍

在C语言中,套接字(Socket)编程主要用于网络通信,尤其是在基于TCP/IP协议的应用程序开发中。常用的套接字编程API主要基于Berkeley Sockets(伯克利套接字)接口,这些函数通常在<sys/socket.h><netinet/in.h>头文件中定义。以下是对常见套接字API的详细讲解,包括函数功能、参数、返回值、涉及的结构体及其成员的含义。


1. socket()

功能

创建新的套接字。

函数原型
int socket(int domain, int type, int protocol);
参数
  • domain: 指定通信协议族(协议域)。
    • 类型: int
    • 常见值:
      • AF_INET(IPv4协议)
      • AF_INET6(IPv6协议)
      • AF_UNIX(本地通信)
    • 含义: 定义套接字的地址格式和通信范围。
  • type: 指定套接字类型。
    • 类型: int
    • 常见值:
      • SOCK_STREAM(面向连接的TCP流)
      • SOCK_DGRAM(无连接的UDP数据报)
      • SOCK_RAW(原始套接字)
    • 含义: 定义通信的语义。
  • protocol: 指定具体协议。
    • 类型: int
    • 常见值:
      • 通常为0(表示由domaintype自动选择默认协议,如TCP或UDP)
      • 特殊值(如IPPROTO_TCPIPPROTO_UDP)用于显式指定协议。
    • 含义: 细化协议选择。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回套接字文件描述符(非负整数)。
    • 失败: 返回-1,并设置errno表示错误。
相关结构体

无直接结构体参数。


2. bind()

功能

将套接字绑定到特定的地址和端口。

函数原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数
  • sockfd: 要绑定的套接字文件描述符。
    • 类型: int
    • 含义: 由socket()创建的套接字。
  • addr: 指向地址结构体的指针。
    • 类型: const struct sockaddr *
    • 含义: 指定绑定的地址和端口。
  • addrlen: 地址结构体的大小。
    • 类型: socklen_t(通常是unsigned int
    • 含义: addr指向的结构体长度。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回0
    • 失败: 返回-1,并设置errno
相关结构体
  • struct sockaddr
    • 定义:
      struct sockaddr {
          sa_family_t sa_family;    // 地址族
          char        sa_data[14];  // 地址数据(具体含义依赖地址族)
      };
      
    • 成员:
      • sa_family: 地址族(如AF_INET)。
        • 类型: sa_family_t(通常是unsigned short
        • 含义: 指定地址类型。
      • sa_data: 地址数据的字节数组。
        • 类型: char[14]
        • 含义: 存储具体地址信息,但通常不直接使用。
  • 实际常用: struct sockaddr_in(针对IPv4)
    • 定义:
      struct sockaddr_in {
          sa_family_t    sin_family; // 地址族
          in_port_t      sin_port;   // 端口号
          struct in_addr sin_addr;   // IP地址
          unsigned char  sin_zero[8]; // 填充字节
      };
      
    • 成员:
      • sin_family: 地址族。
        • 类型: sa_family_t
        • 含义: 通常为AF_INET
      • sin_port: 端口号。
        • 类型: in_port_t(通常是uint16_t
        • 含义: 网络字节序的端口号(如htons(8080))。
      • sin_addr: IP地址。
        • 类型: struct in_addr
        • 定义:
          struct in_addr {
              in_addr_t s_addr; // IPv4地址(32位)
          };
          
        • 成员:
          • s_addr: IPv4地址。
            • 类型: in_addr_t(通常是uint32_t
            • 含义: 网络字节序的IP地址(如inet_addr("127.0.0.1"))。
      • sin_zero: 填充字节。
        • 类型: unsigned char[8]
        • 含义: 用于对齐,通常置为0

3. listen()

功能

将套接字设置为监听状态,用于接受客户端连接(仅限TCP)。

函数原型
int listen(int sockfd, int backlog);
参数
  • sockfd: 要监听的套接字文件描述符。
    • 类型: int
    • 含义: 已绑定的服务器套接字。
  • backlog: 等待连接队列的最大长度。
    • 类型: int
    • 含义: 指定未完成连接的最大排队数(如510)。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回0
    • 失败: 返回-1,并设置errno
相关结构体

无直接结构体参数。


4. accept()

功能

接受客户端连接请求,返回新的套接字用于通信(仅限TCP)。

函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数
  • sockfd: 监听的套接字文件描述符。
    • 类型: int
    • 含义: 已调用listen()的服务器套接字。
  • addr: 客户端地址信息。
    • 类型: struct sockaddr *
    • 含义: 用于存储连接的客户端地址(通常转换为struct sockaddr_in)。
  • addrlen: 地址结构体的长度。
    • 类型: socklen_t *
    • 含义: 传入时为addr的大小,函数返回时为实际地址长度。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回新的套接字文件描述符,用于与客户端通信。
    • 失败: 返回-1,并设置errno
相关结构体
  • bind()中的struct sockaddrstruct sockaddr_in

5. connect()

功能

发起与服务器的连接(用于客户端)。

函数原型
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数
  • sockfd: 客户端套接字文件描述符。
    • 类型: int
    • 含义: 由socket()创建的套接字。
  • addr: 目标服务器地址。
    • 类型: const struct sockaddr *
    • 含义: 指定服务器的地址和端口。
  • addrlen: 地址结构体的长度。
    • 类型: socklen_t
    • 含义: addr的大小。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回0
    • 失败: 返回-1,并设置errno
相关结构体
  • bind()中的struct sockaddrstruct sockaddr_in

6. send()recv()

功能
  • send(): 发送数据。
  • recv(): 接收数据。
函数原型
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数
  • sockfd: 套接字文件描述符。
    • 类型: int
    • 含义: 已连接的套接字。
  • buf: 数据缓冲区。
    • 类型: const void *send)或void *recv
    • 含义: 发送或接收的数据存储位置。
  • len: 数据长度。
    • 类型: size_t
    • 含义: 要发送或接收的字节数。
  • flags: 操作标志。
    • 类型: int
    • 常见值:
      • 0(默认行为)
      • MSG_DONTWAIT(非阻塞)
    • 含义: 修改发送/接收行为。
返回值
  • 类型: ssize_t
  • 含义:
    • 成功: 返回实际发送/接收的字节数。
    • 失败: 返回-1,并设置errno
相关结构体

无直接结构体参数。


7. close()

功能

关闭套接字。

函数原型
int close(int sockfd);
参数
  • sockfd: 要关闭的套接字文件描述符。
    • 类型: int
    • 含义: 由socket()accept()返回的描述符。
返回值
  • 类型: int
  • 含义:
    • 成功: 返回0
    • 失败: 返回-1,并设置errno
相关结构体

无直接结构体参数。


总结

以下是常用套接字API的快速参考表:

函数功能返回值类型主要结构体
socket()创建套接字int
bind()绑定地址intsockaddr, sockaddr_in
listen()开始监听int
accept()接受连接intsockaddr, sockaddr_in
connect()发起连接intsockaddr, sockaddr_in
send()发送数据ssize_t
recv()接收数据ssize_t
close()关闭套接字int

这些API是C语言网络编程的核心,配合结构体(如struct sockaddr_in)使用,可以实现基本的客户端-服务器通信。需要注意网络字节序(htons, ntohs, htonl, ntohl)和错误处理(errno)的使用。


http://www.kler.cn/a/576820.html

相关文章:

  • 怎么用vscode 写 markdown 文档
  • RK3568平台(音频篇)audio_policy_volumes_drc.xml解析
  • 硬件基础(4):(1)AD采集电路设计
  • Golang中的 “...” 操作符
  • 【大厂AI实践】美团:事件图谱在美团智能客服问答中的应用(基于交互的推理)
  • im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略
  • React基础之受控表单绑定
  • 头歌作业-数据库实验一:数据库和数据表的建立,修改和删除
  • 深入解析 JVM —— 从基础概念到实战调优的全链路学习指南
  • 【机械臂】Windows 11安装Mujoco200并运行基于强化学习的多任务机械臂Meta-word基准
  • 论文阅读_LMLPA_用大语言模型实现人格评测
  • 【linux网络编程】浏览网页时客户端与服务器之间数据交互的完整过程
  • 游戏引擎学习第144天
  • 用AI学编程3——Java学习1
  • 轻量级 Transformer 架构多模态预训练框架
  • set、LinkedHashSet和TreeSet的区别、Map接口常见方法、Collections 工具类使用
  • Restful 接口设计规范
  • 从高资源到低资源语言的全覆盖:Manus AI的数据革命与迁移学习策略
  • 从0开始,手搓Tomcat
  • Python——计算机网络