在网络编程中,套接字(Socket)是通信的基础。本文将详细介绍Linux系统下网络编程的核心API函数,包括创建、绑定、监听、连接和数据传输等关键操作。

1. socket() - 创建通信端点

socket()函数用于创建一个通信端点,返回文件描述符供后续操作使用。

#include <sys/socket.h>
#include <arpa/inet.h>

int socket(int domain, int type, int protocol);

参数说明:​

  • domain:协议族

    • AF_INET:IPv4网络协议

    • AF_INET6:IPv6网络协议

  • type:通信类型

    • SOCK_STREAM:流式传输协议(TCP)

    • SOCK_DGRAM:数据报传输协议(UDP)

  • protocol:通常设为0,系统会根据前两个参数自动选择

    • 流式协议默认使用TCP

    • 报式协议默认使用UDP

返回值:​

  • 成功:返回文件描述符(非负整数)

  • 失败:返回-1

2. bind() - 绑定地址和端口

bind()函数将套接字与本地IP地址和端口号关联。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数说明:​

  • sockfd:通过socket()创建的套接字描述符

  • addr:指向包含地址信息的结构体指针

  • addrlen:addr指向的结构体大小

地址结构体详解:​

struct sockaddr_in {
    sa_family_t sin_family;    // 地址族协议(AF_INET)
    in_port_t sin_port;        // 端口号(大端字节序)
    struct in_addr sin_addr;   // IP地址(大端字节序)
    unsigned char sin_zero[8]; // 填充字节
};

服务器端绑定技巧:​

使用INADDR_ANY(值为0,即0.0.0.0)可以绑定本机所有网络接口的IP地址,适用于多网卡环境。

3. listen() - 设置监听状态

listen()函数将套接字设置为监听状态,开始检测客户端连接请求。

int listen(int sockfd, int backlog);

参数说明:​

  • sockfd:已绑定的监听套接字

  • backlog:可同时检测的新连接个数最大值(内核限制为128)

返回值:​

  • 成功:返回0

  • 失败:返回-1

4. accept() - 接受客户端连接

accept()函数从已完成连接队列中接受一个连接请求。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:​

  • sockfd:处于监听状态的套接字

  • addr:用于存储客户端地址信息

  • addrlen:addr指向的内存大小

5. 数据接收函数

网络编程提供两种接收数据的函数,默认情况下都是阻塞的。

read()

ssize_t read(int sockfd, void *buf, size_t size);

recv()

ssize_t recv(int sockfd, void *buf, size_t size, int flags);

参数说明:​

  • sockfd:通信文件描述符

    • 服务器端:accept()的返回值

    • 客户端:通过socket()创建并经connect()初始化的描述符

  • buf:存储接收数据的缓冲区

  • size:缓冲区容量

  • flags:通常设为0(使用默认属性)

返回值:​

  • >0:实际读取的字节数

  • =0:对方已断开连接

  • -1:读取异常

6. 数据发送函数

同样提供两种发送数据的函数。

write()

ssize_t write(int fd, const void *buf, size_t len);

send()

ssize_t send(int fd, const void *buf, size_t len, int flags);

参数说明:​

  • fd:通信文件描述符

  • buf:要发送的数据

  • len:发送数据的实际长度(可使用strlen()获取字符串长度)

  • flags:通常设为0

注意:​​ 当写缓冲区满时,写操作会阻塞。

7. connect() - 客户端连接服务器

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

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数说明:​

  • sockfd:通过socket()创建的通信文件描述符

  • addr:包含服务器IP和端口信息的结构体

  • addrlen:addr指向的内存大小

返回值:​

  • 成功:返回0

  • 失败:返回-1

总结

这些核心API构成了网络编程的基础,理解每个函数的作用和参数含义是编写稳定网络应用程序的关键。在实际开发中,还需要注意错误处理、非阻塞IO、多路复用等高级特性,以构建高性能的网络应用。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐