(1)套接字在网络编程中的作用是什么?为什么叫套接字?
网络编程就是编写程序使两台连网的计算机相互交换数据。在我们不需要考虑物理连接的情况下,我们只需要考录如何编写数据传输软件。操作系统提供了名为“套接字”的部件, 套接字是网络数据传输用的软件设备。
我们把插头插到插座上就能从电网获得电力供给,同样,为了与远程计算机进行数据传输,需要连接到因特网,而编程中的“套接字”就是用来连接该网络的工具。
(2)在服务器端创建套接字后,会以此调用listen函数和accept函数。请比较并说明二者作用。
listen函数将套接字转为可接受连接状态,accept函数受理连接请求,并且如果在没有连接请求的情况下调用该函数,则不会返回。直到有连接请求为止。二者存在逻辑上的先后关系。
(3)Linux中,对套接字数据进行I/O时可以直接使用文件I/O相关函数;而在Windows中则不可以。原因为何?
在Linux世界中,socket也被认为是文件的一种,因此在网络数据传输过程中自然可以使用文件I/O的相关函数。Windows则与Linux不同,是要区分socket和文件的。因此在windows中需要调用特殊的数据传输相关函数。
(4)创建套接字后一般会给它分配地址,为什么?为了完成地址分配需要调用哪个函数?
套接字被创建之后,只有为其分配了IP地址和端口号后,客户端才能够通过IP地址及端口号与服务器端建立连接。
调用bind函数来完成地址分配。
(5)Linux中文件描述符与Windows的句柄实际上非常类似。请以套接字为对象说明它们的含义。
为了程序员与操作系统之间更好地沟通,文件描述符或者句柄,只不过是为了方便称呼操作系统创建的文件或套接字而赋予的数字而已。
(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)参考本书给出的示例low_open.c和low_read.c,分别利用底层文件I/O和ANSI标准I/O编写文件赋值程序。可任意指定赋值程序的使用方法。