【问题标题】:Socket and file descriptors套接字和文件描述符
【发布时间】:2012-11-02 21:39:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: sockets file-descriptor


    【解决方案1】:

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

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

    唯一的区别 send()write() 之间存在 flags 参数。带一个 flags 参数等于 0,send() 等价于 write()

    【讨论】:

    • 但是文件不同于文件描述符,对吧?套接字如何既是文件描述符又是文件描述符?我觉得socket类似于文件描述符,socket缓冲区类似于文件。
    【解决方案2】:

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

    【讨论】:

    • 在 UNIX 中是否将所有内容视为文件?像所有的过程?还有套接字文件的外观或它包含什么?
    • 说文件描述符是指向文件表的“指针”可能会令人困惑,因为文件描述符被定义为一个整数。也许最好说文件描述符是内核中文件描述符表数组的索引(索引的复数)。
    【解决方案3】:

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

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

    【讨论】:

    • 我对文件描述符的解释是否正确,你能说文件描述符表是某种多态性吗?
    • @Carlj901 是的,有点。文件描述符(由opensocket 返回)是该表或指针的索引,然后这些指针可以指向不同的结构,具体取决于它是文件还是套接字。
    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多