1./etc/services里面存储服务信息
ruptimed 4000/tcp
这条就是一个服务信息。因为文件中没有这条信息,所以在运行时,出现, servname not supported for ai_socktype。
所以只需要把ruptimed 4000/tcp添加到/etc/services文件中。
ruptimed是服务名,4000是端口号,tcp是连接类型(4000没有被其他服务占用)
打开这个文件,会看见很多相似条目,比如dns,smtp,pop3等。
自定义的端口号小于1024。
2.客户端输出
09:14:28 up 1:22, 3 users, load average: 0.04, 0.07, 0.16
3.daemonize函数可以不调用。
4.客户端流程
1)socket函数创建fd,只是具有基本类型,并没有添加服务器参数。相当与只是声明了一个容器。
2)getaddrinfo用来查询服务ruptimed的信息。其中包括了服务的端口号,类型(这些属于服务器信息,只是注册为了标准服务信息/etc/services)。
3)connect函数建立连接,参数是客户端的fd和客户端的地址,这个地址应该是服务器的地址信息。因为两个程序再同一台主机运行,所以直接使用了本机地址。但是如果在不同机器运行,需要填对方地址,否则没有目标发送报文。
4)就是recv接收服务器发送来的信息,用fd客户端作为识别标志。
5服务器端流程
1)gethostname获取主机名,这个在文件/etc/hosts中可以查到。
2)daemonize函数是释放线程资源函数,此处可以注释掉。
3)getaddrinfo用来查询服务ruptimed的信息。其中包括了服务的端口号,类型(这些属于服务器信息,只是注册为了标准服务信息/etc/services)。
4)socket函数创建了服务器端的fd。
5)bind将服务器端的fd与自身的ip绑定。可以参见16.3.4。
6)listen服务器端的fd。
7)如果listen成功,就可以等待accept接受客户端请求,参数是服务器端的fd,如果有客户端连接了就返回一个clfd作为监听到的客户端标识。
8)send数据到客户端,以监听到clfg作为目标标识。
客户端代码
服务器端代码