unix网络编程笔记

时间:2021-04-29 22:13:24
端口是TCP/IP协议用来标识不同服务或进程的,TCP/IP协议只有一套,这包括了层层的硬件软件但端口只是个标识,不是硬件存在(区别于接口)它是由TCP/IP协议分配的例如80端口是邮件服务,那么所有连接到80端口的用户都“共享”80端口只是分配了不同的套接字。所以端口是很经用的,固定的;套接口是不停分配的在你的服务器主机上,端口只用指定一个,以后就都是这个每连接一个用户创建一个套接口,也就是说:在一个端口上存在多个套接口而对客户端来说,如果你想在客户机上连接两个用户,那你就必须指定两个端口,以区别这两个用户。
1,“信号是软件中断。很多比较重要的应用程序都需要处理信号。信号提供了一种处理异步时间的方法”           ——《APUE》
在服务器子进程终止时会给父进程发送一个SIGCHLD信号,用来返回一些子进程结束的信息,若父进程不处理则子进程进入“僵死“状态,继续占用资源。(设置“僵死"状态的目的是维护子进程的信息,以便父进程在以后某个时候获取。)
2,服务器主进程调用signal函数(里面调用wait/waitpid,返回终止进程ID和终止状态。正如他们名字所示,若调用他们时无终止进程则一直阻塞到出现,所以把它们放在由中断触发的signal函数里。)处理信号(信号产生时自动触发)
3,"既然该信号是父进程阻塞于”慢系统调用accept“时捕获的,内核于是致使accept返回一个EINTR(被中断的系统调用)错误。而父进程在调用accept时没考虑这个错误返回值,于是终止。"     即由中断信号产生了两个问题需要处理:SIGCHLD信号和被中断的系统调用。
4,服务器进程终止,TCP/IP协议还没挂。作为进程终止的一部分,打开的所有描述字都被关闭,协议向客户端发送一个FIN,客户TCP响应一个ACK。     SIGCHLD信号被发送给父进程并正确处理。     客户机上没发生任何特殊之事,因为客户TCP接收到FIN只是表示服务器进程已关闭了连接的服务器端,从而不再往其中发送任何数据而已。FIN的接受并没有告知客户TCP服务器已经终止。     客户进程仍阻塞在fgets上等待用户输入。输入完之后返回服务器已终止。即无法立即得知服务器状况。(select和poll)
5,服务器主机崩溃,TCP也挂了。FIN也懒得发了。客户机全然不知啊!服务器瞬间消失!     先不说用户阻塞与fgets,既是你输入了一行文字,由于服务器TCP断开,客户TCP不断尝试重传,约9分钟才放弃!!     5.1:给readline设置一个超时     5.2:套接口选项
6,服务器主机关机。系统会给所有进程发送一个SIGTERM--SIGKILL信号,等进程慢慢的结束,所以情况和4服务器进程终止差不多
7,IO复用。select/poll函数的作用是:内核一旦发现晋城指定的一个或多个IO条件就绪(即fd准备好了没有或出了什么问题),他就立即通知进程。这个能力称为I/O复用。阻塞型函数。