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函数,通过调 ...
随机推荐
- How to export data from Thermo-Calc 如何从Thermo-calc导出文本数据
记录20180510 问题:如何从thermo-calc导出文本数据供origin绘图? 解决: In Thermo-Calc graphical mode, you can just add a ' ...
- Unity Inspector添加自定义按钮(Button)
在Unity开发游戏的时候,为了有一个更快更方便的工作流,我们往往会在Editor下开发一些方便实用的工具.在工具中,用到最多,最关键的就是按钮,它是工具的首席执行官.下面就用最简单的代码来演示添加一 ...
- 290. Word Pattern【LeetCode by java】
今天发现LintCode页面刷新不出来了,所以就转战LeetCode.还是像以前一样,做题顺序:难度从低到高,每天至少一题. Given a pattern and a string str, fin ...
- 智能合约bug以及修改方案
截取两篇文章:第一遍文章说的是智能合约能不能修改的问题: ETC转到ETH地址以及转币进ETH智能合约账户能不能转出来? 第0章 引言 如果ETC充值到了ETH地址上,能找回来吗?答案是不一定. ET ...
- week2--操作系统是如何工作的
潘恒 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.一个简单的时间 ...
- Linux内核分析第一周——计算机是如何工作的
冯诺依曼体系结构 核心思想 1.冯诺依曼是:数字计算机的数制采用二进制:计算机应该按照程序顺序执行. 2.采用二进制作为计算机数值计算的基础,以0.1代表数值.不采用人类常用的十进制计数方法,二进制使 ...
- Leetcode题库——38.报数
@author: ZZQ @software: PyCharm @file: countAndSay.py @time: 2018/11/9 14:07 说明:报数序列是一个整数序列,按照其中的整数的 ...
- vue如何触发某个元素的单击事件?
<a class="link" @click.native="test">1111</a> <a class="link ...
- Android GridView数据绑定
java代码构造个泛型数组用于存放item,作为title List<Map<String, Object>> items = new ArrayList< ...
- 解决Delphi 2010启动时出现cannot create xxxx\EditorLineEnds.ttr问题
由于在Windows安装了最近的更新(KB2982791, KB2970228)后,Delphi的IDE需要创建的一个文件%TEMP%\EditorLineEnds.ttr会被系统锁定,导致除非重新启 ...