(1)套接字在网络编程中的作用是什么?为何称它为套接字?
网络编程就是编写程序使两台连网的计算机相互交换数据。两台计算机传输数据,在不考虑物理连接(如今大部分计算机都已连接到庞大的物联网,因此不用考虑到物理连接)的情况下,套接字是网络数据传输用的软件设备。
我们把插头插到插座上就能从电网获得电力供给,同样,为了与远程计算机进行数据传输,需要连接因特网,而编程中的“套接字”就是用来连接该网络的工具。它本身就带有“连接”的含义,如果将其引申,则还可以表示两台计算机的网络连接。
(2)在服务器端创建套接字后,会依次调用listen函数和accept函数。请比较并说明二者作用。
listen函数相当于构建电话机中的连接电话线,accept函数相当于构建电话机中的拿起电话筒。
调用listen函数转为可接收请求状态,调用accept函数受理连接请求。
(3)Linux中,对套接字数据进行I/O时可以直接使用文件I/O相关函数;而在Windows中则不可以。原因如何?
在Linux的世界里,socket也被认为是文件的一种,因此在网络数据的传输过程中自然可以使用文件I/O的相关函数。
Windows严格区分文件I/O函数和套接字I/O函数。
(4)创建套接字后一般会给它分配地址,为什么?为了完成地址分配需要调用哪个函数?
套接字就像给电话机分配电话号码一样利用bind()函数来完成地址分配。
(5)Linux中的文件描述符与Windows的句柄实际上非常类似。请以套接字为对象说明它们的含义。
Linux内部也将套接字当作文件,因此,不管创建文件还是套接字都返回文件描述符。Windows中通过调用系统函数创建文件时,返回“句柄”(handle),换言之,Windwos中的句柄相当于Linux中的文件描述符。只不过Windows中要区分文件句柄和套接字句柄。虽然都称为”句柄“,但不像Linux那样完全一致。文件句柄相关函数与套接字句柄相关函数是有区别的,这一点不同与Linux文件描述符。
(6)底层文件I/O函数与ANSI标准定义的文件I/O函数之间有何区别?
”底层“这个表达可以理解为”与标准无关的操作系统独立提供的“。
文件I/O 又称为低级磁盘I/O,遵循POSIX相关标准。任何兼容POSIX标准的操作系统上都支持文件I/O。标准I/O被称为高级磁盘I/O,遵循ANSI C相关标准。只要开发环境中有标准I/O库,标准I/O就可以使用。(Linux 中使用的是GLIBC,它是标准C库的超集。不仅包含ANSI C中定义的函数,还包括POSIX标准中定义的函数。因此,Linux 下既可以使用标准I/O,也可以使用文件I/O)。
通过文件I/O读写文件时,每次操作都会执行相关系统调用。这样处理的好处是直接读写实际文件,坏处是频繁的系统调用会增加系统开销,标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数。
文件I/O中用文件描述符表现一个打开的文件,可以访问不同类型的文件如普通文件、设备文件和管道文件等。而标准I/O中用FILE(流)表示一个打开的文件,通常只用来访问普通文件。
(7)暂略