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