网络编程期末复习

网络编程期末复习第一章 理解网络编程和套接字第二章第三章 地址族与数据序列第五章 基于TCP的服务器端/客户端第六章 基于UDP的服务器端/客户端第七章 优雅地断开套接字连接第九章 套接字的多种可选项第十章 多进程服务器端第十一章 进程间通信第十二章 I/O复用第十三章 多种I/O函数第十四章 多播与广播第一章 理解网络编程和套接字(1)套接字在网络编程中的作用是什么?为什么叫套接字?答:网络编程就是编写程序使两台连网的计算机相互交换数据。在我们不需要考虑物理连接的情况下,我们只需要考录如何编写数据
摘要由CSDN通过智能技术生成

第一章 理解网络编程和套接字

在这里插入图片描述
(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(流)表示一个打开的文件,通常只用来访问普通文件。

第二章

2.3
(1)什么是协议?在收发数据中定义协议有何意义?
答:协议使对话中使用的通信规则。在收发数据中定义协议,能够让计算机之间进行正确无误的对话,以此来交换数据。

(2)面向连接的TCP套接字传输特性有3点,请分别说明。

a.可靠性,传输过程中数据不会消失。

b.字节流,按序传输数据,传输数据不存在数据边界。

c.面向连接,双方之间必须建立连接后,才可进行数据的传递。

(3)下列哪些是面向消息的套接字特性?
a.传输数据可能丢失
b.没有数据边界(Boundary)
c.以快速传递为目标
d.不限制每次传递数据的大小
e.与面向连接的套接字不同,不存在连接的概念
a,c,e

(4)下列数据适合用哪些套接字传输?并给出原因。
a.演唱会现场直播的多媒体数据(UDP),传送这类数据需要速度快,对数据丢失有一定容忍度。
b.某人压缩过的文本文件(TCP),对数据丢失零容忍,所以必须使用具有可靠性的传输方式TCP。
c.网上银行用户与银行之间的数据传递(TCP),也是对数据丢失零容忍。

(5)何种类型的套接字不存在数据边界?这类套接字接收数据时需要注意什么?
答:TCP套接字不存在数据边界。在接收数据时,需要保证在接收套接字的缓冲区填充满之时就从buffer里读取数据。也就是,在接收套接字内部,写入buffer的速度要小于读出buffer的速度。

(6)tcp_server.c和tcp_client.c中需要多次调用read函数读取服务器调用1次write函数传递的字符串。更改程序,使服务器端多次调用(次数自拟)write函数传输数据,客户端调用1次read函数进行读取。为达到这一目的,客户端需延迟调用read函数,因为客户端要等待服务器端传输所有数据。windows和linux都通过下列代码延迟read或recv函数的调用。

for(i=0;i<3000;i++)
printf(“wait time %d \n”,i);

让CPU执行多余任务以延迟代码运行的方式称为“Busy waiting”。使用得当即可推迟函数调用。

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
 
void ErrorHandling(char *message) {
   
	fputs(message, stderr);
	fputs("\n", stderr);
	exit(1);
}
 
int main(int argc, char * argv[]) {
   
	WSADATA wsaData;
	SOCKET hServSock, hClntSock;
	SOCKADDR_IN servAddr, clntAddr;
 

	int szClntAddr;
	char message[] = "Hello World!";
 
	if (argc != 2) {
   
		printf("Usage : %s <port>\n", argv
  • 12
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值