unp学习笔记——Chapter1
1.发现网络拓扑的几个重要的命令
(1).netstat -i 提供网络接口的信息。我们还指定-n 标志以输出数值地址,而不是试图把它们反向解析成名字。netstat -r 展示路由表。
dzhwen@deng:~/unpv13e/intro$ netstat -ni
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 BMU
eth1 BMRU
lo LRU
dzhwen@deng:~/unpv13e/intro$ netstat -nr
内核 IP 路由表
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG eth1
169.254.0.0 0.0.0.0 255.255.0.0 U eth1
192.168.0.0 0.0.0.0 255.255.255.0 U eth1
(2).通过ifconfig获得每个接口的详细信息。
dzhwen@deng:~/unpv13e/intro$ ifconfig eth0
eth0 Link encap:以太网 硬件地址 e8:::ca:7d:6f
UP BROADCAST MULTICAST MTU: 跃点数:
接收数据包: 错误: 丢弃: 过载: 帧数:
发送数据包: 错误: 丢弃: 过载: 载波:
碰撞: 发送队列长度:
接收字节: (0.0 B) 发送字节: (0.0 B)
dzhwen@deng:~/unpv13e/intro$ ifconfig eth1
eth1 Link encap:以太网 硬件地址 :a4:de:b0::
inet 地址:192.168.0.105 广播:192.168.0.255 掩码:255.255.255.0
inet6 地址: fe80::92a4:deff:feb0:/ Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: 跃点数:
接收数据包: 错误: 丢弃: 过载: 帧数:
发送数据包: 错误: 丢弃: 过载: 载波:
碰撞: 发送队列长度:
接收字节: (23.7 MB) 发送字节: (3.3 MB)
中断:
(3).通过ping广播地址来获取网络拓扑
dzhwen@deng:~/unpv13e/intro$ ping -b 192.168.0.255
习题:
1.5.修改客户端和服务器程序,使得客户端加入一个计数器,累计read返回大于零值的次数。在终止前输出这个计数器值,同时把服务器的write的单一调用改成循环调用。
注意:修改程序本身并不复杂,但我们要对最原始的阻塞式的I/O模型要有一定的理解。我们知道在客户端中的计数器自增是原子型操作,当数据报准备好复制数据报时,客户端再将数据从内核复制到用户空间。复制完成后,客户端进程像内核返回成功指示,这时才会在进程上显示相应的数据,并处理数据等等。
因此回到本题,如果我们要使客户端能记录下来,在服务器端发送消息就不能太快,否则客户端会一次read掉服务器多次write的数据。因此,最好在服务器每发送一个字符后休眠一秒。
客户端:
#include "unp.h" int
main(int argc, char **argv)
{
int sockfd, n,num = ;
char recvline[MAXLINE + ];
struct sockaddr_in servaddr; if (argc != )
err_quit("usage: a.out <IPaddress>"); if ( (sockfd = socket(AF_INET, SOCK_STREAM, )) < )
err_sys("socket error"); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(); /* daytime server */
if (inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= )
err_quit("inet_pton error for %s", argv[]); if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < )
err_sys("connect error"); while ( (n = read(sockfd, recvline, MAXLINE)) > ) {
//sleep(1);
num++; //exercise 1.4
recvline[n] = ; /* null terminate */ if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < )
err_sys("read error"); //Exercise 1.4
printf("Num is %d\n",num);
//Exercise 1.4 exit();
}
服务器端:
#include "unp.h"
#include <time.h> int
main(int argc, char **argv)
{
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks; listenfd = Socket(AF_INET, SOCK_STREAM, ); bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); /* daytime server */ Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); Listen(listenfd, LISTENQ); for ( ; ; ) {
connfd = Accept(listenfd, (SA *) NULL, NULL);
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
char* pr = buff;
size_t len = strlen(buff),num = ;
for(;num < len;++num,++pr){
Write(connfd, buff+num,);
sleep();
}
Close(connfd);
}
}
dzhwen@deng:~/unpv13e/intro$ ./testsrv
dzhwen@deng:~/unpv13e/intro$ ./test 127.0.0.1
Mon May ::
Num is
多多指教!
unp学习笔记——Chapter1的更多相关文章
- UNP学习笔记(第十五章 UNIX域协议)
UNIX域协议是在单个主机上执行客户/服务器通信的一种方法 使用UNIX域套接字有以下3个理由: 1.UNIX域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍 2.UNIX域套接字可用于在同 ...
- UNP学习笔记(第十四章 高级I/O函数)
本章讨论我们笼统地归为“高级I/O”的各个函数和技术 套接字超时 有3种方法在涉及套接字的I/O操作上设置超时 1.调用alarm,它在指定超时时期满时产生SIGALRM信号 2.在select中阻塞 ...
- UNP学习笔记(第六章 I/O复用)
I/O模型 首先我们将查看UNIX下可用的5种I/O模型的基本区别: 1.阻塞式I/O 2.非阻塞式I/O 3.I/O复用(select和poll) 4.信号驱动式I/O(SIGIO) 5.异步I/O ...
- UNP学习笔记(第五章 TCP客户/服务程序实例)
我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...
- UNP学习笔记(第二十六章 线程)
线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还 ...
- UNP学习笔记(第七章 套接字选项)
有多种方法获取和设置影响套接字的选项: 1.getsockopt和setsockopt函数 2.fcntl函数 3.ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接 ...
- UNP学习笔记(第三十章 客户/服务器程序设计范式)
TCP测试用客户程序 #include "unp.h" #define MAXN 16384 /* max # bytes to request from server */ in ...
- UNP学习笔记(第十七章 ioctl操作)
ioctl相当于一个杂物箱,它一直作为那些不适合归入其他精细定义类别的特性的系统接口. 本章笔记先放着,到时候有需要再看 ioctl函数 #include <unistd.h> int i ...
- UNP学习笔记(第十三章 守护进程和inetd超级服务器)
关于守护进程可以查看apue的笔记 http://www.cnblogs.com/runnyu/p/4645046.html daemon_init函数 下面给出名为daemon_init函数,通过调 ...
随机推荐
- unity音量设置(同时设置到多个物体上)——引伸语言设置
在游戏中游戏设置是一个很重要的功能,但是比如语言设置和音量设置分散在很多个物体的组件上,如果每个对应的物体都放到一个链表里,会导致程序雍总难堪,使用事件调用是最好的方式 音量存储类 SoundMana ...
- web前端开发分享-css,js入门篇
学习没有捷径,但学习是有技巧与方法. 一,css入门篇: 推荐书籍:css哪些事儿,精通css. 理由:css那些事儿,他是一本介绍css基础类的书,是入门的经典读物. 系统的介绍了css的选 ...
- idou老师教你学Istio :如何用istio实现监控和日志采集
大家都知道istio可以帮助我们实现灰度发布.流量监控.流量治理等功能.每一个功能都帮助我们在不同场景中实现不同的业务.那Istio是如何帮助我们实现监控和日志采集的呢? 这里我们依然以Bookinf ...
- 团队博客 Week14
0. 在吹牛之前,先回答这个问题: 如果你的团队来了一个新队员,有一台全新的机器, 你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出 ...
- [2017BUAA软工助教]剩余个人作业与deadline
软件工程剩余作业与deadline 标签(空格分隔): 软件工程 一.个人阅读作业+总结 对软件工程的学习做一个总结. 阅读下列关于软件开发本质和开发方法的博客/文章,结合自己在个人项目/结对编程/团 ...
- Linux内核分析——计算机是如何工作的
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.计算机是如何工作的 ( ...
- (Alpha)Let's-NABC
效果图 NABC Need 在日常生活中我们也许经常有这样的疑问:在空闲时间内经常感到无处可去:抑或是有个心血来潮的想法却无人响应:或者困扰于自己狭小的交际圈,希望能有更多的朋友.(打个羽毛球没人一起 ...
- Resharper简单安装及代码覆盖率的测试
Resharper简单安装及代码覆盖率的测试 测试环境:VS 2015 专业版 一.下载Resharper 官方链接:https://www.jetbrains.com/resharper/ 点击下载 ...
- php实现文件上传,下载的常见文件配置
配置文件,php.ini uploadfile post_max_size 规定表单上传的最大文件:
- Android控件第2类——ImageView
1.ImageView不仅仅可以显示图片,ImageView可以显示任何Drawable对象. adjustViewBounds:设置ImageView是否调整自己的边界来保证图片的长宽比. crop ...