校园网站推广方案怎么做,wordpress 表白,vs2010做的网站,公司简介100字范文第一部分#xff1a;Socket API的通用性架构它不仅封装了TCP/IP协议#xff0c;还通过统一的接口支持了各种通信协议和设备。1.1 Socket家族的树形结构Linux Socket协议族全景图
├── 标准网络协议族
│ ├── AF_INET (IPv4协议)
│ ├── AF_INET6 (IPv6协议)
│ …第一部分Socket API的通用性架构它不仅封装了TCP/IP协议还通过统一的接口支持了各种通信协议和设备。1.1 Socket家族的树形结构Linux Socket协议族全景图 ├── 标准网络协议族 │ ├── AF_INET (IPv4协议) │ ├── AF_INET6 (IPv6协议) │ ├── AF_UNIX/AF_LOCAL (本地进程通信) │ └── AF_PACKET (原始数据包) ├── 无线通信协议族 │ ├── AF_BLUETOOTH (蓝牙协议) │ │ ├── BTPROTO_HCI (主机控制器接口) │ │ ├── BTPROTO_SCO (同步面向连接) │ │ ├── BTPROTO_L2CAP (逻辑链路控制与适配协议) │ │ └── BTPROTO_RFCOMM (串口仿真) │ ├── AF_IEEE802154 (低功耗无线个域网) │ └── AF_NFC (近场通信) ├── 工业控制协议族 │ ├── AF_CAN (控制器局域网) │ │ ├── RAW_CAN (原始CAN帧) │ │ ├── BCM (广播管理器) │ │ └── ISO TP (ISO 15765-2传输协议) │ └── AF_CANFD (CAN FD扩展) ├── 其他特殊协议族 │ ├── AF_NETLINK (内核-用户空间通信) │ ├── AF_ALG (内核加密API) │ ├── AF_VSOCK (虚拟机通信) │ ├── AF_XDP (eXpress Data Path) │ └── AF_KCM (内核连接复用器) └── 已废弃/遗留协议族 ├── AF_IPX (Novell IPX) ├── AF_AX25 (业余无线电) └── AF_APPLETALK (AppleTalk)1.2 Socket通用API设计// net/socket.c - 统一的socket系统调用 SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval; struct socket *sock; int flags; // 检查参数有效性 if (family 0 || family NPROTO) return -EAFNOSUPPORT; // 分配和初始化socket结构 retval sock_create(family, type, protocol, sock); if (retval 0) return retval; // 分配文件描述符 retval sock_map_fd(sock, flags (O_CLOEXEC | O_NONBLOCK)); if (retval 0) { sock_release(sock); return retval; } return retval; } // 关键所有socket共享的通用结构 struct socket { socket_state state; // 连接状态 short type; // SOCK_STREAM, SOCK_DGRAM等 unsigned long flags; // 标志位 // 核心协议操作函数表 const struct proto_ops *ops; // 协议特定操作 struct fasync_struct *fasync_list; // 异步通知 struct file *file; // 关联的文件 struct sock *sk; // 协议私有数据 wait_queue_head_t wait; // 等待队列 short poll_mask; // poll掩码 };第二部分蓝牙协议栈的Socket封装2.1 蓝牙Socket架构Linux蓝牙协议栈Socket集成 ├── 核心架构 (net/bluetooth/) │ ├── af_bluetooth.c - 蓝牙协议族注册 │ │ ├── 注册PF_BLUETOOTH协议族 │ │ ├── 实现proto_ops操作集 │ │ └── socket创建和绑定 │ └── 各协议层socket支持 │ ├── HCI层 (net/bluetooth/hci_sock.c) │ │ ├── BTPROTO_HCI socket类型 │ │ ├── 原始HCI命令/事件 │ │ └── 蓝牙设备控制 │ ├── L2CAP层 (net/bluetooth/l2cap_sock.c) │ │ ├── BTPROTO_L2CAP socket类型 │ │ ├── 面向连接的数据传输 │ │ └── 流控制和错误检测 │ ├── SCO层 (net/bluetooth/sco.c) │ │ ├── BTPROTO_SCO socket类型 │ │ └── 语音传输支持 │ └── RFCOMM层 (net/bluetooth/rfcomm/sock.c) │ ├── BTPROTO_RFCOMM socket类型 │ └── 串口仿真协议 ├── 用户空间API示例 │ ├── 创建蓝牙socket: socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI) │ ├── L2CAP socket: socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP) │ └── RFCOMM socket: socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) └── 工具链支持 ├── bluez蓝牙协议栈 ├── hcitool设备配置 └── bluetoothctl控制工具蓝牙Socket的具体实现// net/bluetooth/af_bluetooth.c - 蓝牙协议族注册 static const struct net_proto_family bt_sock_family_ops { .family PF_BLUETOOTH, // 协议族号 .owner THIS_MODULE, .create bt_sock_create, // socket创建函数 }; // 蓝牙socket创建函数 static int bt_sock_create(struct net *net, struct socket *sock, int proto, int kern) { int err; // 根据协议类型选择不同的socket实现 switch (proto) { case BTPROTO_HCI: // HCI层socket err hci_sock_create(net, sock, proto, kern); break; case BTPROTO_L2CAP: // L2CAP层socket err l2cap_sock_create(net, sock, proto, kern); if (!err) bt_sock_link(l2cap_sk_list, sock-sk); break; case BTPROTO_SCO: // SCO层socket err sco_sock_create(net, sock, proto, kern); if (!err) bt_sock_link(sco_sk_list, sock-sk); break; case BTPROTO_RFCOMM: // RFCOMM层socket err rfcomm_sock_create(net, sock, proto, kern); if (!err) bt_sock_link(rfcomm_sk_list, sock-sk); break; default: err -EPROTONOSUPPORT; break; } return err; } // L2CAP socket操作集示例 static const struct proto_ops l2cap_sock_ops { .family PF_BLUETOOTH, .owner THIS_MODULE, .release l2cap_sock_release, .bind l2cap_sock_bind, .connect l2cap_sock_connect, .listen l2cap_sock_listen, .accept l2cap_sock_accept, .getname l2cap_sock_getname, .sendmsg l2cap_sock_sendmsg, .recvmsg l2cap_sock_recvmsg, .poll bt_sock_poll, .ioctl bt_sock_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl bt_sock_compat_ioctl, #endif .mmap sock_no_mmap, .socketpair sock_no_socketpair, .shutdown l2cap_sock_shutdown, .setsockopt l2cap_sock_setsockopt, .getsockopt l2cap_sock_getsockopt, };2.2 蓝牙Socket使用示例// 用户空间使用蓝牙socket的示例 #include sys/socket.h #include bluetooth/bluetooth.h #include bluetooth/hci.h #include bluetooth/hci_lib.h // 示例1扫描蓝牙设备 int scan_bluetooth_devices(void) { int dev_id hci_get_route(NULL); // 获取第一个可用适配器 int sock socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); struct sockaddr_hci addr { .hci_family AF_BLUETOOTH, .hci_dev dev_id, }; // 绑定到HCI设备 bind(sock, (struct sockaddr *)addr, sizeof(addr)); // 开始扫描 struct hci_filter flt; hci_filter_clear(flt); hci_filter_set_ptype(HCI_EVENT_PKT, flt); hci_filter_set_event(EVT_INQUIRY_RESULT, flt); setsockopt(sock, SOL_HCI, HCI_FILTER, flt, sizeof(flt)); // 发送查询命令 struct hci_request req; // ... 设置查询参数 ioctl(sock, HCISETSCAN, 1); // 开始扫描 // 接收扫描结果 unsigned char buf[HCI_MAX_EVENT_SIZE]; read(sock, buf, sizeof(buf)); close(sock); return 0; } // 示例2L2CAP Socket通信 int l2cap_communication(void) { // 服务器端 int server_sock socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); struct sockaddr_l2 server_addr { .l2_family AF_BLUETOOTH, .l2_psm htobs(0x1001), // L2CAP PSM .l2_bdaddr *BDADDR_ANY, }; bind(server_sock, (struct sockaddr *)server_addr, sizeof(server_addr)); listen(server_sock, 5); // 客户端 int client_sock socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); struct sockaddr_l2 client_addr { .l2_family AF_BLUETOOTH, .l2_psm htobs(0x1001), .l2_bdaddr {{0x00, 0x1A, 0x7D, 0xDA, 0x71, 0x13}}, // 目标地址 }; connect(client_sock, (struct sockaddr *)client_addr, sizeof(client_addr)); // 数据传输 char buffer[1024]; send(client_sock, Hello Bluetooth, 15, 0); recv(server_sock, buffer, sizeof(buffer), 0); close(server_sock); close(client_sock); return 0; }第三部分CAN总线Socket封装3.1 CAN协议栈Socket架构Linux CAN协议栈Socket集成 ├── 核心架构 (net/can/) │ ├── af_can.c - CAN协议族注册 │ │ ├── 注册PF_CAN协议族 │ │ ├── 实现协议操作函数 │ │ └── 核心数据结构管理 │ ├── 协议模块 │ │ ├── raw.c - 原始CAN socket (SOCK_RAW) │ │ │ ├── 直接访问CAN控制器 │ │ │ ├── 过滤器和错误处理 │ │ │ └── 时间戳支持 │ │ ├── bcm.c - 广播管理器socket │ │ │ ├── 周期消息发送 │ │ │ ├── 变化检测 │ │ │ └── CAN帧序列 │ │ └── isotp.c - ISO-TP传输协议 │ │ ├── 大数据块分段传输 │ │ ├── 流控制和错误处理 │ │ └── 诊断协议支持 │ └── 设备接口层 │ ├── can-dev.c - 通用CAN设备框架 │ ├── 各种CAN控制器驱动 │ └── 虚拟CAN设备支持 ├── 数据结构 │ ├── struct can_frame - CAN数据帧 │ ├── struct can_filter - 过滤器结构 │ └── struct can_bcm_msg - BCM消息 └── Socket选项和IOCTL ├── CAN_RAW_FILTER - 设置过滤器 ├── CAN_RAW_ERR_FILTER - 错误过滤器 ├── CAN_RAW_LOOPBACK - 回环模式 └── CAN_RAW_RECV_OWN_MSGS - 接收自己发送的帧CAN Socket的具体实现// net/can/af_can.c - CAN协议族注册 static const struct net_proto_family can_family_ops { .family PF_CAN, .create can_create, .owner THIS_MODULE, }; // CAN socket创建 static int can_create(struct net *net, struct socket *sock, int protocol, int kern) { struct sock *sk; int rc 0; // 检查协议类型 if (protocol 0 || protocol CAN_NPROTO) return -EINVAL; // 根据协议类型创建不同的socket switch (protocol) { case CAN_RAW: rc raw_init(sock); // 原始CAN socket break; case CAN_BCM: rc bcm_init(sock); // 广播管理器socket break; case CAN_ISOTP: rc isotp_init(sock); // ISO-TP socket break; default: rc -EPROTONOSUPPORT; break; } if (!rc) { sk sock-sk; sk-sk_family PF_CAN; sk-sk_protocol protocol; } return rc; } // CAN核心数据结构 struct can_frame { canid_t can_id; // 32位 CAN ID EFF/RTR/ERR标志 __u8 can_dlc; // 数据长度码 __u8 __pad; // 填充 __u8 __res0; // 保留 __u8 __res1; // 保留 __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); // 数据 }; // CAN过滤器结构 struct can_filter { canid_t can_id; // 匹配的CAN ID canid_t can_mask; // 掩码0不关心 }; // 原始CAN socket操作集 static const struct proto_ops raw_ops { .family PF_CAN, .owner THIS_MODULE, .release raw_release, .bind raw_bind, .connect sock_no_connect, .socketpair sock_no_socketpair, .accept sock_no_accept, .getname raw_getname, .poll datagram_poll, .ioctl raw_ioctl, .gettstamp sock_gettstamp, .listen sock_no_listen, .shutdown sock_no_shutdown, .setsockopt raw_setsockopt, .getsockopt raw_getsockopt, .sendmsg raw_sendmsg, .recvmsg raw_recvmsg, .mmap sock_no_mmap, .sendpage sock_no_sendpage, };3.2 CAN Socket使用示例// 用户空间使用CAN socket的示例 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include net/if.h #include sys/ioctl.h #include sys/socket.h #include linux/can.h #include linux/can/raw.h // 示例1原始CAN Socket读写 int raw_can_example(void) { int s; struct sockaddr_can addr; struct ifreq ifr; struct can_frame frame; // 创建CAN原始socket s socket(PF_CAN, SOCK_RAW, CAN_RAW); if (s 0) { perror(Socket creation failed); return -1; } // 绑定到具体CAN接口 strcpy(ifr.ifr_name, can0); ioctl(s, SIOCGIFINDEX, ifr); addr.can_family AF_CAN; addr.can_ifindex ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)addr, sizeof(addr)) 0) { perror(Bind failed); close(s); return -1; } // 设置过滤器只接收ID 0x123-0x125 struct can_filter rfilter[3]; rfilter[0].can_id 0x123; rfilter[0].can_mask CAN_SFF_MASK; // 标准帧格式 rfilter[1].can_id 0x124; rfilter[1].can_mask CAN_SFF_MASK; rfilter[2].can_id 0x125; rfilter[2].can_mask CAN_SFF_MASK; setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, rfilter, sizeof(rfilter)); // 发送CAN帧 frame.can_id 0x123 | CAN_EFF_FLAG; // 扩展帧 frame.can_dlc 8; memcpy(frame.data, HelloCAN!, 8); if (write(s, frame, sizeof(frame)) ! sizeof(frame)) { perror(Write failed); } // 接收CAN帧 int nbytes read(s, frame, sizeof(frame)); if (nbytes 0) { printf(Received CAN frame ID: 0x%X DLC: %d Data: , frame.can_id CAN_EFF_MASK, frame.can_dlc); for (int i 0; i frame.can_dlc; i) { printf(%02X , frame.data[i]); } printf(\n); } close(s); return 0; } // 示例2CAN广播管理器BCM示例 int bcm_example(void) { int s socket(PF_CAN, SOCK_DGRAM, CAN_BCM); struct sockaddr_can addr; struct ifreq ifr; strcpy(ifr.ifr_name, can0); ioctl(s, SIOCGIFINDEX, ifr); addr.can_family AF_CAN; addr.can_ifindex ifr.ifr_ifindex; connect(s, (struct sockaddr *)addr, sizeof(addr)); // 设置周期性发送消息 struct bcm_msg_head msg_head; struct can_frame frame; msg_head.opcode TX_SETUP; msg_head.flags SETTIMER | STARTTIMER; msg_head.count 0; // 无限发送 msg_head.ival1.tv_sec 1; // 每1秒 msg_head.ival1.tv_usec 0; msg_head.nframes 1; frame.can_id 0x100; frame.can_dlc 2; frame.data[0] 0xAA; frame.data[1] 0x55; // 发送BCM消息 struct iovec iov[2]; iov[0].iov_base msg_head; iov[0].iov_len sizeof(msg_head); iov[1].iov_base frame; iov[1].iov_len sizeof(frame); writev(s, iov, 2); close(s); return 0; } // 示例3ISO-TP诊断协议示例 int isotp_example(void) { int s socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP); struct sockaddr_can addr; struct ifreq ifr; strcpy(ifr.ifr_name, can0); ioctl(s, SIOCGIFINDEX, ifr); addr.can_family AF_CAN; addr.can_ifindex ifr.ifr_ifindex; addr.can_addr.tp.tx_id 0x7E0; // 发送ID addr.can_addr.tp.rx_id 0x7E8; // 接收ID bind(s, (struct sockaddr *)addr, sizeof(addr)); // ISO-TP可以传输超过8字节的数据 unsigned char isotp_data[4096]; struct iovec iov { .iov_base isotp_data, .iov_len 100 }; // 发送大数据块会自动分段 sendmsg(s, (struct msghdr){ .msg_iov iov, .msg_iovlen 1, }, 0); // 接收数据 recv(s, isotp_data, sizeof(isotp_data), 0); close(s); return 0; }第四部分其他特殊协议Socket4.1 Netlink Socket内核-用户空间通信// net/netlink/af_netlink.c /* Netlink Socket实现 */ static const struct net_proto_family netlink_family_ops { .family PF_NETLINK, .create netlink_create, .owner THIS_MODULE, }; // Netlink消息结构 struct nlmsghdr { __u32 nlmsg_len; // 消息长度包括头部 __u16 nlmsg_type; // 消息类型 __u16 nlmsg_flags; // 标志位 __u32 nlmsg_seq; // 序列号 __u32 nlmsg_pid; // 发送进程PID }; // Netlink使用示例 int netlink_example(void) { int sock_fd socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); struct sockaddr_nl src_addr { .nl_family AF_NETLINK, .nl_pid getpid(), // 当前进程PID .nl_groups 0, // 不加入多播组 }; bind(sock_fd, (struct sockaddr *)src_addr, sizeof(src_addr)); // 构建Netlink消息查询网络接口 struct { struct nlmsghdr nlh; struct ifinfomsg ifm; } req; memset(req, 0, sizeof(req)); req.nlh.nlmsg_len NLMSG_LENGTH(sizeof(struct ifinfomsg)); req.nlh.nlmsg_type RTM_GETLINK; req.nlh.nlmsg_flags NLM_F_REQUEST | NLM_F_DUMP; req.nlh.nlmsg_seq 1; req.nlh.nlmsg_pid getpid(); req.ifm.ifi_family AF_UNSPEC; // 发送请求 send(sock_fd, req, req.nlh.nlmsg_len, 0); // 接收响应 char buf[8192]; struct nlmsghdr *nlh (struct nlmsghdr *)buf; recv(sock_fd, buf, sizeof(buf), 0); // 解析响应 for (; NLMSG_OK(nlh, recv_len); nlh NLMSG_NEXT(nlh, recv_len)) { if (nlh-nlmsg_type NLMSG_DONE) break; struct ifinfomsg *ifinfo NLMSG_DATA(nlh); printf(Interface index: %d\n, ifinfo-ifi_index); } close(sock_fd); return 0; }4.2 VSOCK Socket虚拟机通信// net/vmw_vsock/af_vsock.c /* VSOCK协议族实现 */ static const struct net_proto_family vsock_family_ops { .family AF_VSOCK, .create vsock_create, .owner THIS_MODULE, }; // VSOCK地址结构 struct sockaddr_vm { sa_family_t svm_family; // AF_VSOCK unsigned short svm_reserved1; unsigned int svm_port; // 端口号 unsigned int svm_cid; // 上下文ID unsigned char svm_zero[sizeof(struct sockaddr) - sizeof(sa_family_t) - sizeof(unsigned short) - sizeof(unsigned int) - sizeof(unsigned int)]; }; // VSOCK使用示例 int vsock_example(void) { // 主机端CID2 int server_fd socket(AF_VSOCK, SOCK_STREAM, 0); struct sockaddr_vm server_addr { .svm_family AF_VSOCK, .svm_cid VMADDR_CID_ANY, // 监听所有CID .svm_port 1234, }; bind(server_fd, (struct sockaddr *)server_addr, sizeof(server_addr)); listen(server_fd, 5); // 虚拟机内CID3 int client_fd socket(AF_VSOCK, SOCK_STREAM, 0); struct sockaddr_vm client_addr { .svm_family AF_VSOCK, .svm_cid VMADDR_CID_HOST, // 主机CID .svm_port 1234, }; connect(client_fd, (struct sockaddr *)client_addr, sizeof(client_addr)); // 数据传输虚拟机-主机 char buffer[1024]; send(client_fd, Hello from VM, 13, 0); recv(server_fd, buffer, sizeof(buffer), 0); close(client_fd); close(server_fd); return 0; }4.3 ALG Socket内核加密API// crypto/af_alg.c /* 内核加密API Socket */ static const struct net_proto_family alg_family_ops { .family PF_ALG, .create alg_create, .owner THIS_MODULE, }; // ALG Socket使用示例 int alg_example(void) { // 创建加密socket int sock_fd socket(AF_ALG, SOCK_SEQPACKET, 0); struct sockaddr_alg sa { .salg_family AF_ALG, .salg_type skcipher, // 对称加密 .salg_name cbc(aes), // AES-CBC算法 }; bind(sock_fd, (struct sockaddr *)sa, sizeof(sa)); // 设置密钥 unsigned char key[32] { /* 256位密钥 */ }; setsockopt(sock_fd, SOL_ALG, ALG_SET_KEY, key, sizeof(key)); // 创建加密操作的文件描述符 int op_fd accept(sock_fd, NULL, NULL); // 加密数据 unsigned char plaintext[64] Data to encrypt; unsigned char ciphertext[64]; // 设置IV初始化向量 unsigned char iv[16] {0}; setsockopt(op_fd, SOL_ALG, ALG_SET_IV, iv, sizeof(iv)); // 执行加密 write(op_fd, plaintext, sizeof(plaintext)); read(op_fd, ciphertext, sizeof(ciphertext)); close(op_fd); close(sock_fd); return 0; }第五部分Socket API设计的精妙之处5.1 统一的接口设计模式/* Socket API的通用模式 */ struct socket_api_pattern { // 1. 地址结构统一 struct sockaddr { sa_family_t sa_family; // 协议族标识符 char sa_data[14]; // 协议特定地址 }; // 2. 统一的系统调用 int socket(int domain, int type, int protocol); int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); int listen(int sockfd, int backlog); int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 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); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int close(int fd); // 3. 协议特定的操作通过proto_ops抽象 struct proto_ops { int (*bind)(struct socket *sock, struct sockaddr *myaddr, int sockaddr_len); int (*connect)(struct socket *sock, struct sockaddr *vaddr, int sockaddr_len, int flags); int (*socketpair)(struct socket *sock1, struct socket *sock2); int (*accept)(struct socket *sock, struct socket *newsock, int flags); int (*getname)(struct socket *sock, struct sockaddr *addr, int peer); unsigned int (*poll)(struct file *file, struct socket *sock, struct poll_table_struct *wait); int (*ioctl)(struct socket *sock, unsigned int cmd, unsigned long arg); int (*listen)(struct socket *sock, int len); int (*shutdown)(struct socket *sock, int flags); int (*setsockopt)(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen); int (*getsockopt)(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen); int (*sendmsg)(struct socket *sock, struct msghdr *m, int total_len); int (*recvmsg)(struct socket *sock, struct msghdr *m, int total_len, int flags); int (*mmap)(struct file *file, struct socket *sock, struct vm_area_struct *vma); ssize_t (*sendpage)(struct socket *sock, struct page *page, int offset, size_t size, int flags); ssize_t (*splice_read)(struct socket *sock, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags); }; };5.2 文件描述符的魔力/* * Socket设计最精妙之处统一到文件描述符抽象 * * 所有socket都映射到一个文件描述符这带来了 * 1. 统一的I/O操作read/write/select/poll/epoll * 2. 继承和复制语义通过fork和exec * 3. 资源管理一致性close自动清理 * 4. 权限控制通过文件权限位 */ // 内核中的socket文件操作 static const struct file_operations socket_file_ops { .owner THIS_MODULE, .llseek no_llseek, .read_iter sock_read_iter, // 支持readv/read .write_iter sock_write_iter, // 支持writev/write .poll sock_poll, // poll/epoll支持 .unlocked_ioctl sock_ioctl, // ioctl支持 .mmap sock_mmap, // mmap支持 .release sock_close, // close时清理 .fasync sock_fasync, // 异步通知 .sendpage sock_sendpage, // sendfile零拷贝 .splice_write generic_splice_sendpage, // splice支持 .splice_read sock_splice_read, }; // 这使得以下代码对所有socket都有效 int handle_socket_io(int sock_fd) { fd_set read_fds; struct timeval tv; FD_ZERO(read_fds); FD_SET(sock_fd, read_fds); tv.tv_sec 5; tv.tv_usec 0; // select可以用于任何socket int ret select(sock_fd 1, read_fds, NULL, NULL, tv); if (ret 0 FD_ISSET(sock_fd, read_fds)) { char buffer[1024]; // read可以用于任何socket ssize_t n read(sock_fd, buffer, sizeof(buffer)); if (n 0) { // 处理数据 } } return 0; }第六部分现代扩展和未来趋势6.1 XDP SocketeBPF驱动的高速包处理// net/xdp/xsk.c /* XDP Socket实现 */ static const struct net_proto_family xsk_family_ops { .family AF_XDP, .create xsk_create, .owner THIS_MODULE, }; // XDP Socket使用示例 SEC(xdp_sock) int xdp_sock_prog(struct xdp_md *ctx) { int index ctx-rx_queue_index; // 重定向到用户空间socket if (bpf_map_lookup_elem(xsks_map, index)) { return bpf_redirect_map(xsks_map, index, 0); } return XDP_PASS; } // 用户空间XDP Socket使用 int xdp_socket_example(void) { // 创建XDP socket int sock_fd socket(AF_XDP, SOCK_RAW, 0); // 绑定到特定队列 struct sockaddr_xdp sxdp { .sxdp_family AF_XDP, .sxdp_ifindex if_nametoindex(eth0), .sxdp_queue_id 0, // RX队列0 }; bind(sock_fd, (struct sockaddr *)sxdp, sizeof(sxdp)); // 设置环形缓冲区零拷贝 struct xdp_mmap_offsets off; getsockopt(sock_fd, SOL_XDP, XDP_MMAP_OFFSETS, off, sizeof(off)); void *rx_map mmap(NULL, off.rx.desc NUM_DESCS * sizeof(struct xdp_desc), PROT_READ | PROT_WRITE, MAP_SHARED, sock_fd, XDP_PGOFF_RX_RING); // 直接访问数据包绕过内核协议栈 struct xdp_desc *rx_desc rx_map off.rx.desc; while (1) { // 检查是否有新数据包 if (rx_desc-addr) { void *packet_data rx_map rx_desc-addr; // 处理原始数据包极低延迟 process_packet(packet_data, rx_desc-len); // 释放描述符 rx_desc-addr 0; } } close(sock_fd); return 0; }6.2 KCM Socket内核连接复用器// net/kcm/kcmsock.c /* KCM Socket实现 - 将多个socket复用为一个 */ static const struct net_proto_family kcm_family_ops { .family AF_KCM, .create kcm_create, .owner THIS_MODULE, }; // KCM使用示例将多个TCP连接复用为一个socket int kcm_multiplex_example(void) { int kcm_fd socket(AF_KCM, SOCK_DGRAM, 0); struct sockaddr_kcm skcm; // 创建KCM multiplexer memset(skcm, 0, sizeof(skcm)); skcm.skcm_family AF_KCM; skcm.skcm_ifindex 0; // 自动分配 bind(kcm_fd, (struct sockaddr *)skcm, sizeof(skcm)); // 添加TCP socket到KCM多路复用器 int tcp_fd socket(AF_INET, SOCK_STREAM, 0); // ... 连接TCP服务器 // 将TCP socket附加到KCM struct kcm_attach attach_info { .fd tcp_fd, }; setsockopt(kcm_fd, SOL_KCM, KCM_ATTACH, attach_info, sizeof(attach_info)); // 现在可以通过单个KCM socket读写所有附加的socket char buffer[1024]; // 从任何连接的socket接收数据 recv(kcm_fd, buffer, sizeof(buffer), 0); // 发送到所有连接的socket或特定socket send(kcm_fd, buffer, strlen(buffer), 0); close(kcm_fd); return 0; }Socket API确实是Linux网络子系统最成功的设计之一。它通过统一的接口抽象了各种底层通信协议从传统的TCP/IP到蓝牙、CAN总线再到现代的高速数据处理XDP和内核加密ALG。这种设计体现了UNIX哲学中万物皆文件的思想将复杂的网络通信简化为文件描述符操作极大地简化了应用程序的开发。这种架构的美妙之处在于其可扩展性和一致性可扩展性任何新的通信协议都可以通过实现proto_ops接口集成到socket框架中一致性所有socket都支持相同的I/O多路复用机制select/poll/epoll安全性通过文件权限和命名空间提供访问控制性能支持零拷贝、内存映射等高级优化这正是为什么Linux能够支持从嵌入式设备到超级计算机的各种网络需求从工业控制CAN到消费电子蓝牙从传统网络TCP/IP到现代云原生XDP所有这些都通过统一的socket API实现。