Linux fd 系列 — socket fd 是什么?
原创Linux fd 系列 — socket fd 是什么?
在Linux系统中,文件描述符(File Descriptor,简称fd)是一个用于文件系统操作的重要概念。它是一个非负整数,用于唯一标识已打开的文件、管道、套接字等文件对象。fd 系列文章旨在帮助读者深入了解 Linux 系统中的文件描述符,本文将重点介绍 socket fd 的概念和作用。
什么是 socket fd?
socket fd 是文件描述符的一种,用于描述网络中的套接字。套接字是网络通信的基础,它允许两个进程在不同的主机之间进行数据交换。在 Linux 系统中,socket fd 是通过系统调用 socket 创建的,它代表了一个已形成的套接字连接。
socket fd 的创建
在 Linux 系统中,创建 socket fd 的首要系统调用是 socket。以下是创建 socket fd 的基本步骤:
#include <sys/socket.h>
#include <unistd.h>
int socket(int domain, int type, int protocol);
该函数返回一个 socket fd,如果创建失利,则返回 -1。参数说明如下:
- domain:指定协议族,如 AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNIX(Unix 套接字)等。
- type:指定套接字类型,如 SOCK_STREAM(流式套接字)、SOCK_DGRAM(数据报套接字)、SOCK_RAW(原始套接字)等。
- protocol:指定协议,对于 AF_INET 和 AF_INET6,该参数通常设置为 0,由内核自动选择合适的协议。
socket fd 的使用
创建 socket fd 后,可以对其进行各种操作,如绑定、监听、连接、发送、接收等。以下是一些常用的 socket fd 操作:
绑定(bind)
绑定操作用于将 socket fd 绑定到指定的 IP 地址和端口号。以下是绑定操作的示例代码:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明如下:
- sockfd:要绑定的 socket fd。
- addr:指向 sockaddr 结构体的指针,包含要绑定的 IP 地址和端口号。
- addrlen:addr 指针指向的结构体长度。
监听(listen)
监听操作用于使 socket fd 处于监听状态,等待客户端的连接请求。以下是监听操作的示例代码:
#include <sys/socket.h>
#include <unistd.h>
int listen(int sockfd, int backlog);
参数说明如下:
- sockfd:要监听的 socket fd。
- backlog:最大连接数,当连接请求过多时,超出该值的连接将被拒绝。
连接(connect)
连接操作用于客户端与服务器形成连接。以下是连接操作的示例代码:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数说明如下:
- sockfd:要连接的 socket fd。
- addr:指向 sockaddr 结构体的指针,包含要连接的服务器 IP 地址和端口号。
- addrlen:addr 指针指向的结构体长度。
发送(send)和接收(recv)
发送和接收操作用于在客户端和服务器之间传输数据。以下是发送和接收操作的示例代码:
#include <sys/socket.h>
#include <unistd.h>
int send(int sockfd, const void *buf, size_t len, int flags);
int recv(int sockfd, void *buf, size_t len, int flags);
参数说明如下:
- sockfd:要发送或接收数据的 socket fd。
- buf:指向接收或发送数据的缓冲区的