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的更多相关文章

  1. UNP学习笔记(第十五章 UNIX域协议)

    UNIX域协议是在单个主机上执行客户/服务器通信的一种方法 使用UNIX域套接字有以下3个理由: 1.UNIX域套接字往往比通信两端位于同一个主机的TCP套接字快出一倍 2.UNIX域套接字可用于在同 ...

  2. UNP学习笔记(第十四章 高级I/O函数)

    本章讨论我们笼统地归为“高级I/O”的各个函数和技术 套接字超时 有3种方法在涉及套接字的I/O操作上设置超时 1.调用alarm,它在指定超时时期满时产生SIGALRM信号 2.在select中阻塞 ...

  3. 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 ...

  4. UNP学习笔记(第五章 TCP客户/服务程序实例)

    我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...

  5. UNP学习笔记(第二十六章 线程)

    线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还 ...

  6. UNP学习笔记(第七章 套接字选项)

    有多种方法获取和设置影响套接字的选项: 1.getsockopt和setsockopt函数 2.fcntl函数 3.ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接 ...

  7. UNP学习笔记(第三十章 客户/服务器程序设计范式)

    TCP测试用客户程序 #include "unp.h" #define MAXN 16384 /* max # bytes to request from server */ in ...

  8. UNP学习笔记(第十七章 ioctl操作)

    ioctl相当于一个杂物箱,它一直作为那些不适合归入其他精细定义类别的特性的系统接口. 本章笔记先放着,到时候有需要再看 ioctl函数 #include <unistd.h> int i ...

  9. UNP学习笔记(第十三章 守护进程和inetd超级服务器)

    关于守护进程可以查看apue的笔记 http://www.cnblogs.com/runnyu/p/4645046.html daemon_init函数 下面给出名为daemon_init函数,通过调 ...

随机推荐

  1. shellcode 初次使用笔记

    winXP SP3 环境 (xp环境默认没开启栈不可执行机制,比较方便破解,如果已开启了,请自行百度如何关闭) dig.exe 目标文件 x86dbg调试工具 python 环境 打开准备好的目标软件 ...

  2. 阿里(蚂蚁,菜鸟)+百度+网易面经(JAVA)

    本人综述: 本人本科和硕士均是毕业于普通的双非院校,参加过ACM竞赛,阿里面了三次全被拒了,网易收到offer. 阿里面试: 阿里的面试问的都是很基础的东西,如操作系统的简单问题,计算机网络的基本问题 ...

  3. mysql 查询所有子节点的相关数据

    定义一个函数 ) CHARSET utf8 BEGIN ); ); SET sTemp = '$'; SET sTempChd =cast(rootId as CHAR); WHILE sTempCh ...

  4. 《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

    <Linux内核分析> 第五节 扒开系统调用的三层皮(下) 20135307 一.给MenusOS增加time和time-asm命令 给MenuOS增加time和time-asm命令需要 ...

  5. C#回调函数的简单讲解与应用例子(最简单讲解,大神绕道)

    本博客一直以来的宗旨就是:用最简单的方式讲清楚不复杂的问题. 因为本人也很菜所以也没法讲太复杂HHHHHH...... 所以如果哪天某个大神看到了觉得讲的有问题欢迎指出. 话不多说进入正题.. ——— ...

  6. d3 数学方法(伪随机数生成器 )

    一.正态(高斯)分布(normal (Gaussian) distribution)的随机数 /* var nomarlRandmo = d3.random.normal(); console.log ...

  7. Java内置锁synchronized的实现原理

    简述Java中每个对象都可以用来实现一个同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock). 具体表现形式如下: 1.普通同步方法,锁的是当前实例对象 ...

  8. ES6学习笔记(四):异步操作

    Promise Promise三种状态 pending.resolved.rejected 使用语法 var promis = new Promise(function(resolve,reject) ...

  9. 等价类计数(Polya定理/Burnside引理)学习笔记

    参考:刘汝佳<算法竞赛入门经典训练指南> 感觉是非常远古的东西了,几乎从来没有看到过需要用这个的题,还是学一发以防翻车. 置换:排列的一一映射.置换乘法相当于函数复合.满足结合律,不满足交 ...

  10. maven项目打包时生成dependency-reduced-pom.xml

    今天给maven项目打jar包,发现在pom.xml文件的同路径下,突然生出了一个dependency-reduced-pom.xml,也不知道这个文件是干什么的,看着别扭就想着删除了它. 后来知道是 ...