Linux fd 系列 — socket fd 是什么?

原创
ithorizon 5个月前 (10-12) 阅读数 43 #Linux

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);

参数说明如下:

文章标签: Linux


热门