send file descriptor via socket

本文介绍如何通过sendmsg函数利用套接字在两个进程间传递文件描述符的方法,并提供了一个快速输入文件内容到控制台的例子。此外,还演示了如何通过fork和cmsg来验证关闭文件描述符不会立即释放它的特性。

http://stackoverflow.com/questions/8481138/how-to-use-sendmsg-to-send-a-file-descriptor-via-sockets-between-2-processes

man 3 cmsg


an interesting mail in linux-security mail list. 2 points:

1. use cat to quickly input a c file

2. use fork and cmsg to demonstrate close fd not release it.

### 套接字文件描述符的概念 在编程中,套接字文件描述符是一个整数值,用于唯一标识一个打开的网络连接或端点。通过调用 `socket()` 函数创建一个新的套接字并返回该套接字对应的文件描述符[^1]。 当成功执行函数 `socket(AF_INET, SOCK_STREAM, 0)` 后,如果返回值不是 `-1`,则表明已成功创建了一个新的套接字,并且可以利用此返回值作为后续操作中的文件描述符[^2]。 ### 文件描述符的具体用途 #### 创建套接字 以下是创建套接字的一个典型代码片段: ```c int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } ``` 上述代码展示了如何使用 `socket()` 来获取一个有效的套接字文件描述符 `sockfd`。一旦获得这个描述符,就可以将其传递给其他系统调用来完成绑定地址、监听请求以及接受新连接等功能。 #### 绑定本地地址到套接字 为了使服务器能够接收来自客户端的数据包,通常需要将套接字与特定的 IP 地址和端口号关联起来。这可以通过 `bind()` 实现,其中第一个参数即为之前得到的套接字文件描述符。 #### 多路复用 I/O 操作 除了基本的读写功能外,在某些场景下可能还需要监控多个套接字的状态变化以便及时响应事件发生。此时可借助于多路复用机制来实现高效处理。例如,Linux 提供了三个主要接口——`select`, `poll`, 和 `epoll`—它们允许应用程序监视一组文件描述符上的活动情况[^4]。 下面是一段简单的例子展示如何使用 `select` 对几个套接字进行轮询检测是否有数据到达: ```c #include <sys/select.h> // Assume 'sockets' is an array containing all interested sockets. fd_set readfds; FD_ZERO(&readfds); for (size_t i = 0; i < num_sockets; ++i) { FD_SET(sockets[i], &readfds); } struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; int ret = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout); if (ret > 0) { // At least one socket has data ready to be read. } else if (ret == 0){ printf("Timeout occurred! No data after five seconds.\n"); } else { perror("select failed"); } ``` 以上程序说明了如何设置待观察的一组文件描述符集合并通过指定超时期限来进行阻塞等待直到某个条件满足为止。 ### 总结 总之,套接字文件描述符在整个通信过程中扮演着极其重要的角色,它不仅代表了一条逻辑通道还充当了许多底层 API 调用的核心参数之一。掌握好它的概念及其实际应用对于深入理解计算机网络原理至关重要[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值