套接字和文件描述符

Car*_*901 17 sockets file-descriptor

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

套接字描述符与文件描述符共享此数组,但指针指的是套接字.或者还有什么东西只用于套接字?

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

Som*_*ude 20

是的,套接字也是与文件在同一个表中的索引.至少对于UNIX系统(如Linux和OSX),Windows是不同的,这就是为什么你不能使用eg readwrite接收和发送数据.

每个进程都有自己的"文件"描述符表.


Dra*_* G. 13

套接字(描述符)和文件描述符之间没有区别。

套接字只是文件的一种特殊形式。

例如,您可以在套接字描述符上使用文件描述符上使用的系统调用read()write()

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
Run Code Online (Sandbox Code Playgroud)

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

  • @BradPitt,如果不是专家,我认为文件描述符是一个将套接字指向文件的索引。它让内核找到套接字(它作为文件存储在内存中),并且其他程序(例如您可能编写的程序)可以使用其文件描述符(一个整数,只是列表中的索引)来引用套接字I/O 资源的数量。0、1 和 2 文件描述符是 stdin、stdout 和 stderr。) (2认同)

小智 6

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