Linux C网络编程基本知识

第 1 章:TCP/IP 网络编程基础

1.  客户端和服务器程序必须运行在相同操作系统上吗?为什么?
答:不是,在网络中计算机之间的彼此通信标准遵循 TCP/IP 协议,并在操作系统内核中实现。而具体应用层的客户端和服务器之间遵循相同的协议,即通信双方所交换数据的表示方法和含义达成一致的约定。

2.  一台机器上可以同时运行多个不同的网络应用,操作系统如何正确递交数据。
答:在网络中,计算机对收到的数据按照 TCP/IP 协议进行解析,在传输层获得数据传输的源端口和目的端口,操作系统根据端口号将数据传送至相对应的应用进程。其中端口号由通信协议内核(网络部分)进行分配和管理,进程 PID 由操作系统内核进行分配和管理,端口号和进程并非绑定在一起的,操作系统维护了端口号与进程对应关系的关系表。

第 2 章:Linux 下的 C 编程环境

1. 掌握信号处理函数的安装方法 signal 以及它对信号处理函数类型的要求答:信号处理函数安装:

(1)、signal() #include <signal.h>
void (*signal(int signum, void (*handler))(int)))(int);
如果该函数原型不容易理解的话,可以参考下面的分解方式来理解: typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler));
第一个参数指定信号的值,第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为 SIG_IGN);可以采用系统默认方式处理信号(参数设为 SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)。
如果 signal()调用成功,返回最后一次为安装信号 signum 而调用 signal()时的 handler 值;失败则返回 SIG_ERR。

(2)、sigaction() #include <signal.h>
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

sigaction 函数用于改变进程接收到特定信号后的行为。该函数的第一个参数为信号的值,可以为除 SIGKILL 及 SIGSTOP 外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。第二个参数是指向结构 sigaction 的一个实例的指针,在结构 sigaction 的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理;第三个参数 oldact 指向的对象用来保存原来对相应信号的处理,可指定 oldact 为 NULL。如果把第二、第三个参数都设为 NULL,那么该函数可用于检查信号的有效性。

处理函数类型:对信号的处理包括忽略信号(SIG_IGN)、默认处理(SIG_DEF)、捕获信号(自定义自己的信号处理函数)三种方式。

2.掌握安装定时器的方法(准备好时间间隔、准备好处理函数、signal/sig_action 调用和 setitimer 调用)

3.线程同步和互斥各自解决什么问题?
答:线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

线程互斥是指对于共享的进程系统资源,在单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

同步作用:防止线程并发访问临界资源时导致错误。

第 3 章 网络编程中常用的典型知识

1.  如何识别函数指针?它常见的作用是什么?
答:函数指针:指向函数的指针。void (*f) ( ); 作用:在调用接口不变的情况下,动态使用不同的函数实现,极大提高了应用程序的灵

活性。

注: 返回指针的函数(指针函数) char *strcat( char *dest, const char *src );

第 4 章 基础套接字

1.掌握基于流式套接字的基本编程方法(含客户端和服务器)
服务器:socket()->bind()->listen()->accept()->read()->write()->close();客户端:socket()->connect()->write()->read()->close();

2.掌握基于数据报套接字的基本编程方法(含客户端和服务器)
服务器:socket()->bind()->recvfrom()->sendto()->close();客户端:socket()->sendto()->recvfrom->close();

3.了解两类套接字内部实现上的差别,做到能够回答如下问题:

3.1 数据报套接字方式下,如果服务器进程没有启动,客户端调用 sendto 能成功吗?
答:能,数据报套接字方式进行通信时,传输层使用 UDP 协议,收发报文无确认机制,并不保证数据传输的可靠性,sendto 只负责将要发送的数据放入发送缓冲区,由内核进行发送。

3.2流式套接字方式下,如果服务器进程没有启动,客户端调用 connect 或 write 能成功吗?答:不能,服务器端启动后,客户端调用 connect()向服务器端指定的地址和端口发起
TCP 连接(通过三次握手)。当服务器端未启动,客户端无法与服务器端成功建立 TCP 连接,因此调用 connect 无法成功,write 也无法成功。

3.3两类套接字方式下,服务器可以不显示绑定端口吗?客户端呢?
答:服务器不可以,客户端可以。服务器端处于被动连接方式下,需要将应用进程创建的套接口与相应的本地 IP 地址和端口(众所周知端口)进行绑定,以便客户端主动连接到该端口。而客户端主动连接服务器,在其发起 connect 连接后,由内核自动绑定到一个临时端口和地址上。

3.4流式套接字方式下,客户端和服务器成功建立连接并且客户端成功发送一次请求、服务器成功返回一次应答,此时,服务器端进程被关闭。请问:如果之后客户端调用 read 操作能发现服务器失效吗?将关闭服务器进程这一条件改成拔掉服务器端的网线,结果如何?换成数据报套接字方式结果如何?

流式套接字:服务器端进程关,read 操作能发现,服务器端进程关闭,服务器端操作系统内核会通知客户端:服务器进程关闭。若拔掉网线,read 操作不能发现,服务器端操作系统的任何通知都无法通过网络传送至客户端,而客户端会一直等待。

数据包套接字:拔掉网线,服务器端进程关闭,客户端进程不能发现服务器失效,udp是无连接的,不保证数据传输的可靠性,客户端接收缓冲区无数据可读,read 操作会处于阻塞状态。

3.5流式套接字方式下,系统是如何保证消息接收的顺序以及消息传输的可靠性的?为什么称之为端到端方式?
答:流式套接字是基于 TCP 协议的,TCP 拥有滑动窗口机制,其对每个数据包进行编号,对收到的按序到达数据包的最高序号给予确认。超时重传机制保证,对超时未收到确认的数据包进行重传。TCP 提供了流量控制和拥塞控制,检错机制。

端到端:服务器端和客户端应用进程基于 TCP 协议,进行三次握手,建立连接。相当于建立了服务器端和客户端应用进程之间的通路,实现数据的收发。

第 5 章 高级套接字

1.  理解采用 I/O 多路复用 select 能解决哪些问题,还可能存在什么问题
答:解决的问题:可以同时管理多个 socket,不用分别创建线程管理各个 socket,使得单进程也能具有为多个客户端同时提供服务的能力,且占用的资源数更少了。

存在的问题:

(1)    当部分套接字处于活跃状态,但程序仍然必须对所有的套接字进行遍历,其时间复杂度为 O(n),效率太低。

(2)    可以处理的连接数量有限(1024)。

(3) 每次调用 select 都需要将 fd 集合从用户态拷贝到内核态,此开销在 fd 很多时,开销会很大。

2.  理解信号驱动 I/O 可以解决什么问题
答:多用于数据包套接字,在数据包套接字通信方式中,客户端连接上服务器端后,向服务器端发送请求后,会一直等待服务器端的响应。利用信号驱动 I/O,客户端操作系统在接收缓冲区有数据可读时,即刻向应用程序发送信号,应用程序收到信号后进行数据的读取或处理已经在信号处理程序中读取完毕的数据,而不用一直阻塞,等待服务器响应,可以进行其他。

3. 理解为什么有些情况需要设置 socket 为非阻塞模式以及如何设置为非阻塞模式答:情况:
(1)    read/write 操作阻塞:
read 操作阻塞:客户端和服务器端进行通信时,若接收缓存中无数据可读,则 read 操作会一直阻塞,等待接收缓冲区中有数据可读。 write 操作阻塞:若发送缓冲区满了,则 write 操作无法通过 socket 向发送缓冲区写入数
据,需要等待发送缓冲区可写,才能写入,否则,阻塞。

(2)    accept 操作阻塞
在服务器端进程开启,若没有客户端连接服务器,则会一直阻塞,等待客户端进行连接。(3) connect 操作阻塞客户端和服务器端建立三次握手过程中,若客户端发送的 SYN 分段未收到服务器端的

ACK 分段或分段丢失,则会一直阻塞。

设置非阻塞模式:

通过 fcntl 函数设置网络套接字标志状态为 O_NONBLOCK

第 6 章 网络协议

1. 理解网络协议设计的主要原则
答:
(1) 正确无二义:设计的协议可以满足应用的功能,使得通信双方所交换数据的表示方法和含义达成一致的约定。
(2)高效:应用程序执行效率高,阻塞情况较少,无出错。
(3) 可拓展:在应用程序添加新的功能时,设计的应用程序能够通过该协议实现,且不会出错,不需要设计新的协议。

2.  理解协议设计的主要内容及变长字段处理方式

答:内容:

(1) 消息类型(2) 具体字段(3) 编码方式(4) 变长处理
变长字段处理:
(1) 添加分隔符分隔变长字段(2) 增加长度字段,标识变长字段长度。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值