25

我正在学习 Unix 中的网络编程,目前正在尝试理解套接字和文件描述符的概念。据我了解,文件描述符只是指针数组(文件描述符表?)中的一个位置,这些指针指向内存中某处的文件。

套接字描述符是否与文件描述符共享此数组,但指针改为指向套接字。还是有其他仅用于套接字的东西?

这个数组对每个应用程序/进程都是唯一的吗?

4

3 回答 3

26

是的,套接字也是与文件相同的表的索引。至少对于 UNIX 系统(如 Linux 和 OSX),Windows 是不同的,这就是为什么您不能使用 eg readandwrite来接收和发送数据的原因。

每个进程都有自己的“文件”描述符表。

于 2012-11-14T11:40:26.620 回答
11

Socket 只不过是 UNIX 操作系统中的一个文件。在 UNIX 操作系统中,甚至所有内容都被视为文件。每当我们创建一个套接字时,就会在文件描述符表中创建一个条目,其中包含标准 i/o 和标准错误以及其他详细信息。文件描述符充当指向文件表的指针,其中包含有关要执行的操作(即读取、写入等)的信息,并且它包含指向该特定文件的 inode 表的指针,并且您可能知道 inode 包含所有必要的文件的详细信息。

于 2016-01-09T13:12:03.550 回答
6

套接字(描述符)和文件描述符之间没有区别。套接字只是文件的特殊形式。例如,您可以在文件描述符上使用的套接字描述符上使用相同的系统调用read()write() 。

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

send()write()之间的唯一区别是标志参数的存在。如果 flags 参数为零,则send()等效于write()

于 2018-11-20T16:32:14.653 回答