【发布时间】:2012-11-02 21:39:46
【问题描述】:
我正在学习 Unix 中的网络编程,目前正在尝试理解套接字和文件描述符的概念。据我了解,文件描述符只是指针数组(文件描述符表?)中的一个位置,这些指针指向内存中某处的文件。
套接字描述符是否与文件描述符共享此数组,但指针改为指向套接字。还是有其他只用于套接字的东西?
这个数组对每个应用程序/进程来说都是唯一的吗?
【问题讨论】:
我正在学习 Unix 中的网络编程,目前正在尝试理解套接字和文件描述符的概念。据我了解,文件描述符只是指针数组(文件描述符表?)中的一个位置,这些指针指向内存中某处的文件。
套接字描述符是否与文件描述符共享此数组,但指针改为指向套接字。还是有其他只用于套接字的东西?
这个数组对每个应用程序/进程来说都是唯一的吗?
【问题讨论】:
套接字(描述符)和文件描述符之间没有区别。 套接字只是文件的特殊形式。 例如,您可以在文件描述符上使用的套接字描述符上使用相同的系统调用 read() 和 write()。
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
唯一的区别 send() 和 write() 之间存在 flags 参数。带一个 flags 参数等于 0,send() 等价于 write()。
【讨论】:
Socket 只是 UNIX 操作系统中的一个文件。在 UNIX 操作系统中,甚至所有内容都被视为文件。每当我们创建一个套接字时,就会在文件描述符表中创建一个条目,其中包含标准 i/o 和标准错误以及其他详细信息。文件描述符充当指向文件表的指针,其中包含有关要执行的操作(即读取、写入等)的信息,并且它包含指向该特定文件的 inode 表的指针,并且您可能知道 inode 包含所有必要的文件的详细信息。
【讨论】:
是的,套接字也是与文件相同的表的索引。至少对于 UNIX 系统(如 Linux 和 OSX),Windows 是不同的,这就是为什么你不能使用例如read 和 write 接收和发送数据。
每个进程都有自己的“文件”描述符表。
【讨论】:
open 或socket 返回)是该表或指针的索引,然后这些指针可以指向不同的结构,具体取决于它是文件还是套接字。