第一篇:业余孔子学校听课笔记
家长学校听课笔记
如何迈好第一步,小学一年级行为习惯的培养
学员: 主题:
我国著名教育家叶圣陶先生说:“什么是教育?简单一句话,就是要养成良好的习惯”
良好的习惯会使孩子受益终身,小学一年级是良好习惯的关键时期,如何让孩子少走弯路,不走弯路,提出的以下建议。
良好的习惯是一点点积累训练出来的,不是唠叨出来的。总结为四个字“看 听 想 做”
看:培养孩子注意看老师的演示、板书和眼神
听:培养孩子注意听老师的讲课,听同学们回答问题,从同学们不同的回答,为什么和自己的不同,由此培养孩子学会思考的好习惯
想:培养孩子学会思考的好习惯,知道自己学会了什么,不会什么
做:培养孩子自己动手,自己的事情自己做。从穿衣服,吃饭, 整理书包,检查作业等各个方面。
隔代教育弊大于利,父母一定要亲自教育孩子。
小学一年级开始,从以下几个方面培养孩子良好的学习习惯:
1、 按时上学,不迟到,不早退,如果有事不能上学,必须和老师请假。培养孩子写作业的习惯,根据孩子的具体情况限定时间,半个小时到1个小时。
2、 自己整理书包,课前整理下节课的书包。下课后如果要出去玩,一定要提前上厕所。
3、 上课专心听讲,注意执笔方法的规范正确。
4、 遵守课堂纪律,课堂纪律是良好习惯培养的重点。
5、 写作业要认真、专心,做错的题要及时改正找到原因,要在规定的时间内完成。
6、 上课要勤于思考,积极回答问题。
7、 倾听的习惯,思考为什么自己的回答和同学的不一样
8、 阅读的习惯,让孩子爱上阅读,阅读是一件美好的事情,提高阅读速度。
9、 提高学生的安全意识,不做危险的动作,增强自我保护意识。
10、 集体活动要守时。
11、 讲文明,讲礼貌,尊重老师,尊重同学
12、 培养良好的卫生习惯。
13、 珍惜他人的劳动成果。
14、 让孩子使用标准语言,不要使用类似于“吃饭饭”等语言。
好习惯平均21天基本形成,保持90天彻底养成。 如何培养
1、 告诉孩子好习惯的重要性,比如让孩子知道不良的卫生习惯会有什么后果。
2、 制定培养计划,并取得老师的帮助。
3、 榜样的力量,树立家长的威信,言教胜于身教。
4、 持之以恒。
5、 及时的鼓励,及时的批评指正。 如何关注孩子的身心健康 开心--健康--学习
1、 不能想起了才教育
2、 不能生气了才教育
3、 不能把交谈变成说教
4、 避免消极对待。
5、 避免经常与别人做简单的比较。
6、 勿数罪并罚,坏习惯不是一天可以改过来的。
7、 不在吃饭时、睡觉时教育孩子。吃饭、睡觉是一件美好的事情。如果孩子哭完不要马上睡觉。 教育孩子的几个误区
1、 盲目信任孩子------举例一个家长只是问孩子写完作业没,从来不亲自检查,导致后来孩子没做完作业也说做完了,因为他知道家长不检查,养成了说谎的习惯。
2、 每天都检查作业-------举例一个家长每天都仔细检查孩子的作业,但在学校考试时孩子成绩不好,老师问她为什么答完题不检查时,孩子说在家写完作业都是家长检查的。所以要培养孩子自己检查作业的习惯。不会不可怕,马虎最可怕。
3、 “板凳把孩子绊倒了,我打它”-----推卸责任。
4、 一切把孩子放到首位-----举例一个孩子因妈妈吃掉一个他喜欢的大虾而说出你把它吐出来的事情,要教育孩子学会好东西要与人分享。
最后由于时间关系提出以下几个方面,让家长自己领会。
1、 家长和老师是一伙的
2、 亲其师信其道
3、 身教胜于言传
4、 不包办代替
5、 不要为了提醒揭孩子的短
6、 换位思考,成为朋友
7、 不当众批评孩子,容易影响孩子的心理健康
8、 树立正确的偶像
9、 奖罚分明,但要适当
10、 不要把曾经的理想让孩子来实现,要了解孩子
11、 不要轻易许愿
12、 培养一个善良的孩子
第二篇:《孔子》观影笔记
读了《朝花夕拾》才觉得鲁迅也有平凡人一样天真的童年和懵懂的少年时期;看了《孔子》才知道圣人有免不了人生的悲欢离合,艰难苦痛,不再只是教科书上讲的那样遥不可及的“至圣先师”。
在诸侯争霸,战乱割据的年代里,孔子出生在一个小诸侯国的没落贵族家庭。为了安邦定国,他带着自己“仁”的思想投身于仕途。他在鲁国,曾官至代国相,以其非凡的智慧和勇气在朝堂之上舌战群儒,救下殉葬小奴;用牛车造势,吓退齐国数百辆战车,不费一兵一卒得到返还失地的承诺。内怎稳鲁国政治,外扬鲁国国威。这是孔子仕途上最为通畅的时期了,但完美的理想总是收到现实的阻碍,在“陪臣理国政”的鲁国,支持的孔子的鲁昭公权利受限,孔子“毁三都”等做法伤害到三桓的利益,遭到权臣排斥,被迫离开鲁国,此时孔子55岁。
好在孔子还有一群尊师重教的弟子,机灵聪颖的颜回,仗义豪爽的子路都誓死追随夫子的脚步,一起踏上了周游列国的道路。战火四起的年代里,诸侯都以割据争霸为目的,不能接受孔子超越时代的德治思想。或将孔子拒之门外,或给其一个讲学的虚职,总之就是不采纳他的政治思想。在游学的过程中,孔子一行历经重重艰难,曾被卷入政治斗争之中,也曾被困入战事之中,有的弟子被饿死,最后只剩一碗马肉汤分而食之,孔子却以琴声代食,不禁令人唏嘘感叹。最催人泪下的是颜回去世的场面,寒冷的冬天,孔子师徒越过冰封的河面,不幸遇上冰裂,有些弟子溺水而亡,孔子的书卷也大数落入水中,颜回为救夫子的书而一次次的钻入冰凉刺骨的喝水中,用尽生命的力气从水中抛出一卷卷书,最终溺水而亡。孔子是颜回至尊至爱的夫子,在他的心中,夫子的书籍比自己的生命更为重要。颜回是孔子最为喜爱的弟子,颜回去世后,孔子抱着他冰冷的身体不肯放手,弟子们都劝到:“已经三个时辰了,暖不回来了”。孔子还是舍不得放开颜回,悲痛的表情令人潸然泪下。一波未平一波又起,鲁莽的子路死于卫国内乱,死前却不忘夫子“君子正其衣冠”的教导,孔子虽然十分伤心,但也有所欣慰。
周游列国十四年后,孔子终于回到自己的家乡鲁国,对政治失意的他退而不隐,开始致力于教育事业,有教无类,弟子三千。孔子因其超越时代的先进政治思想和教育理念,使儒学完胜于后世,成为整个封建社会的主流思想,在现代,孔子的思想也影响深远,成为国家软实力的重要组成部分。
第三篇:孔子世家读书笔记范文
细细品味一本名著后,大家对人生或者事物一定产生了许多感想,此时需要认真思考读书笔记如何写了哦。那么你会写读书笔记吗?以下是小编为大家整理的孔子世家读书笔记范文,供大家参考借鉴,希望可以帮助到有需要的朋友。孔子世家读书笔记1
孔子说:“仁者爱山,智者乐水。”仁者何以乐山,智者何以乐水?山水是天地自然的象征,是一切生命的源泉和万物栖息之所;是仁者对生命的寄托,是智者对自然的依恋。这是孔子对天人相结合境界的最高体验。孔子的一生追求仁,被大多数人认为是仁者,但是他更是智者。因为他更钟情于水。
孔子观赏东流的水,子贡问道:“君子只要看见大水都要观赏,原因是什么?”孔子答道:“因为大水流动永不停息,而且滋润世间万物却不自认为有功,就像人的德行一样。水有时在低处流动,有时在高处流动,这都有其遵循的规律,就像人的仁义一样。大水浩浩荡荡,永不枯竭,这就像人的道德一样。水流向百仞高的大山中而不惧怕,这就像人的勇敢一样。装满了却用不着用盖子削平,这就像人的正直一样。水的柔弱无所不至,就像人的明察一样。水从源头必定流向东方,就像人的志向一样,所以君子看见了必定要观赏它。”孔子用滔滔江水比做人的德行,勉励我们进德修业应像奔流不止的河水昼夜不舍,永不停息。这不仅体现孔子的智慧,而且不也暗示了孔子的一生如流水一般吗?
孔子一生仕途不顺畅,如流水般曲曲折折。孔子35岁去齐国,见到齐景公。由于受大臣晏婴的阻止,没有得到齐景公的重用,37岁返鲁。孔子从51岁起,先是做了鲁国得县官,后来官至鲁国的最高法官,并代理丞相。可是只有三个月的功夫,由于鲁王不听他的意见,孔子只好辞职,离开鲁国。在55岁到68岁这14年间,奔走列国:在齐国受到排斥,在宋国、卫国遭到驱逐,在陈国、蔡国之间遭受厄困。于是又返回鲁国。
社会现实却是让人痛心。周王室统治微弱,“礼崩乐坏”,诸侯纷纷崛起,伦理秩序失控,社会纲常紊乱。孔子想到自己的先祖弗父何禅让君位,正考父曾接连辅佐宋国三公,父亲叔梁纥勇猛震三鲁,母亲颜徵含辛茹苦地教育培养自己。孔子叩心自问:自己为什么不能像传说中的盘古一斧劈开混沌的世界,令天地分开、泾渭分流?为什不能像文武周公那样文治武功,把天下治理得井井有条、太太平平?自己虽没有君王之位来施展政治抱负,也没有威武之师可以征伐世上邪恶,但是自己有知识、有智慧,可以用教育开启人的心智,用“六艺”来培养“上事君以忠,下使民以惠”的贤臣,改造这种“礼崩乐坏”的社会现实,实现“大道之行,天下为公”的太平盛世。于是孔子不怕困难,如流水般,坚持自己的信仰,朝着自己的目标前进。他下定决心,走上杏坛,传先王之道、授六艺之技、育天下之才。
哀公三年,孔子当时60岁。孔子周游列国到宋,和弟子们在大树下“习礼”。桓魋扬言要杀孔子时,砍倒大树。弟子们让孔子快跑。孔子却安慰弟子们,曰:“天生德于予,桓魋其如予何!”之后,孔子以及他的弟子们秘密地离开宋国。等到桓魋得知孔子师徒出行的消息,派兵追赶时,孔子一行早已消失在茫茫的夜幕中。孔子师徒先后来到新郑。当时孔子风尘仆仆、疲惫不堪,非常狼狈。子贡等人四处寻找孔子。有一位老人对子贡说:“东门有个老头,长相不凡。脑门子像尧帝,脖颈似尧时的名法官皋陶,双肩类似郑国大夫子产,腰以下不及禹三寸,脊背微曲,又瘦又乏,累若丧家之犬。”子贡见到孔子后,便把老人的话学给孔子听。孔子听后,见大家失魂落魄的模样,不禁大笑,说:“说我形状像贤相,那可不敢当。说我像一只丧家之犬,倒是很像,很像!”像这种坦坦荡荡、从容不迫地对待挫折、坚持自己的信仰,孔子是有过之而无不及的。
最后,假如将孔子和庄子相互比较的话,在主观上,我更向往庄子那样逍遥自在的精神境界;但是在客观上,我更提倡孔子的处世智慧。尽管孔子曾提出“刑不上大夫”这一不平等的法律。但人生孰能无过?孔子还是有值得我们学习的地方。孔子的思想包含着中华民族千百年来为人处世的智慧,给人们修身、齐家、治国、平天下提供了宝贵的经验。更重要的是,他的精神如流水不绝,激励着万代子孙。孔子世家读书笔记2
这篇又拖了很久,老是看了一段又回过去看前面相关篇目的内容,比如说到孔子的六世祖孔父嘉,就回去看“宋微子世家”,后来又说到孔子在鲁国的经历,于是又回去把“鲁周公世家”浏览了一遍。这一篇通篇看来,总体感觉是:孔子一生在仕途上可说是郁郁不得志,四处漂泊如丧家之犬;在学术上却是逐渐精深逐渐博大终于积累弟子三千,书成春秋经典。
孔子为人谦恭好礼,有些过分好礼了,所以齐国晏婴建议齐景公不用他,确实他不适合齐国的施政方针。要在春秋战国时期在政治上有所作为,得脸厚、心狠、手辣,得见机行事善于权变,看样子孔子不具备这些特质,而且他提倡的那一整套关于礼的理论,并不适合那一个弱肉强食的时代,不实用啊。再说他脸皮也太薄了,与南子见了一面,回来被学生“不悦”,就急得发誓赌咒,“予所不者,天厌之,天厌之。”不必这么紧张吧,反倒引人遐想。在他后期是有所醒悟了,会权变了,但他的形象已定型,没人敢用他了。
孔子真正令人称道的,还是在思想上和教育上的成就,他整理编写的《诗》、《书》、《礼》、《乐》、《易》、《春秋》六经,确是中国千年文化中经典中的经典,他教育学生的.种种言论,让我在这里评价一句正确都觉得不够贴切不够资格,因为孔子的思想已经构成中国传统文化的灵魂,每一个中国人在成长的过程中或多或少都受到孔子思想的滋养,我们其实更多要做的是用孔子的思想来衡量现实的所作所为,而不是以一已之私对孔子思想进行评论。
关于孔子的思想是一个太博大的话题,以我笨拙的笔墨无法写出其中万一,只是觉得很奇怪的是:一个说出那么多经典的对的话的人,为什么不能做对的事,让他能够在当世得偿所愿施展才华呢?看到他那句:“不怨天,不尤人,下学而上达,知我者其天乎!”让人不能不品出一些苦涩。孔子世家读书笔记3
今天把《史记·孔子世家》孔子学琴原文找出来看了看,准备将文言文背下来,刚读一句,发现方向性错误,我学这个故事是为了三大,最有价值的就是孔子学琴的态度、方法,而不是文言文本身,既然如此,会复述完整的意思即可,没必要浪费时间背诵别人听不懂的文言文!
孔子学琴,体现了牛人惯有的特质,他们的行为其实很简单,就是单爆,把一件事情做透,做到极致,即专注。学琴,孔子专注把每一个环节做到极致,给自己大量的时间练习,甚至于师襄子都觉得是在浪费时间。
结果是很戏剧的,也是很合理的,师襄子在催促孔子多次后拜服于孔子。对快、慢、多、少的理解的差异,决定了人生的高度。
在孔子眼里,慢就是快,少就是多,慢慢的雕琢每一个环节,达到技艺纯熟,每天理解一点,一段时间后便会看到整个森林。师襄子认为要快速的练习大量曲目,短时间能弹奏众多曲目,因为时间限制,均只能在同一个层面上泛泛而弹,难以突破,其认为的快就是快、多就是多最终会是快就是慢、多就是少。
中美篮球教练的理念很能诠释这点:美国教练教学生时,会告诉学生要慢慢的将某个动作正确的练熟,哪怕一个正常只需1秒的动作,现在就是做10秒也得正确,然后大量练习。他们认为,开始慢没关系,动作熟了,自然就快了。
国内教练呢,刚好相反,相同的动作,不要求正确掌握与否,相似即可,只求一定要快,正常1秒,练习时一定要半秒做完。
结果很多学员一辈子也没掌握好这个动作,总是失误,更别提快了。前段时间国家篮球队集训,长时间大量练习基本的动作,很能说明问题。
第四篇:linux 网络 笔记(听课笔记)
一网络预备知识
1. IP 主机的标识,32bit 无符号的二进制,通常用点分十进制表示
3个基本类:
A 类:最高字节高位0 1 + 3 网络号 + 主机号
0.0.0.0191.255.255.255 2^162
192.0.0.0239.255.255.255
用途:常用作组播地址
E 类:最高字节高位1111 0
240.0.0.065535
150000 //系统用的
5000124]; //填充字段
本地地址结构体 struct sockaddr_un {
sa_family_t sun_family; // 协议族
char sun_path[108];
//108字节协议地址
};// 传参
void * arg ;
通用地址结构体:
struct sockaddr {
sa_family_t sa_family; // 协议族
char sa_data[14]; //14字节协议地址
};
一创建套接字
Int socket(int domain, int type, int protocol); 功能
domain:指明所使用的协议族,通常为PF_INET/AF_INET,表示互联网协议族(TCP/IP协议族);
type:指定socket的类型:SOCK_STREAM (TCP)或SOCK_DGRAM(UDP) protocol:协议的编号通常赋值"0" 返回值
Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。
失败返回 -1 Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议。 绑定端口
Int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能:把sockfd 绑定一个具体的端口 sockfd : 描述符
addr : 本机的结构ip的地址不允许绑定非本机IP 如:(192.168.2.10) addrlen: 告知内核ip地址大小, 必须为实际的地址大小网络为16 正确返回0 失败返回-1
udp接收数据端
Ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen);) 功能接收数据 Sockfd 描述符
Buf 存放接收到的数据
Len 最多可以接收的数据大小
Flags 接收的方式(默认是阻塞,通常是0) Src_addr 获取发送端的ip地址信息
Addrlen 告知内核发送端ip地址大小(结构大小) 返回值
成功返回实际接收的数据大小
返回值如果为0
表示对方已关闭 失败返回 -1
udp发送数据端
Ssize_t sendto(int sockfd,const void *buf,size_t len,int flags,struct sockaddr *dest_addr,socklen_t addrlen); 功能:发送数据 Sockfd : 描述符
Buf: 用户需要发送的数据缓存地址 Len:用户最多发送的数据大小
Flags:发送方式(默认是阻塞,通常设为0) Dest_addr: 当前数据发送的目标主机ip地址值
Addrlen: 告知目标主机ip地址的大小(结构大小) 返回值
成功返回实际发送的数据大小 失败返回 – 1
Tcp申请三次握手(客户端)
Int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 实现客户端与服务器的连接 Sockfd: 套接字描述符 Addr:服务器ip结构地址
Addrlen:服务器ip结构地址大小 成功返回 0
失败返回-1 注意:再次申请,它会断开先前建立的连接,重新建立新的连接连接:获知对方存在
(Tcp)监听(服务器端)
Int listen(int sockfd, int backlog); 功能:实现对客户端请求的监听(队列机制) Sockfd: 套接字描述符
Backlog:队列的长度,一般设为5 追打可设为8 返回值:
成功返回 0,失败返回 -1
(Tcp)回复三次握手(服务器端) 功能:回复客户端握手申请,建立连接
Int accept(int sockfd,struct sockaddr *addr, socklen_t *addrlen); Sockfd: 套接字描述符
Addr: 对方(客户端)ip 地址
Addrlen:对方(客户端)ip 地址大小
成功返回非负整数(新的socket描述符)失败返回
-1
Tcp 数据接收
Ssize_t recv(int sockfd,void *buf,size_t len,int flags); 功能接收数据
Sockfd: (客户端)是套接字描述符(服务器端)是accept()的返回值 Buf: 存放接收到的数据
Len: 最多可以接收的数据大小
Fags: 发送方式(默认是阻塞,通常设为0) 成功返回实际接收的数据大小失败返回 -1; 返回值如果为0
表示对方已关闭
Tcp数据发送
Ssize_t send(int sockfd,void *buf,size_t len,int flags); 功能:发送数据
Sockfd : (客户端)是套接字描述符(服务器端)是accept()的返回值 Buf: 用户需要发送的数据缓存地址 Len:用户最多发送的数据大小
Flags:发送方式(默认是阻塞,通常设为0) 成功返回实际发送的数据大小失败返回 -1 关闭套接字 @1
Int Shutdown(int sockfd,int how) 功能:指定方式关闭套接字 Socket: 套接字描述符
How: SHUT_RD 或0 (关闭读) SHUT_WR或1(关闭写) SHUT_RDWR或2(关闭读写)相当于close() 成功返回
0 失败返回 -1 @2
Int close(int sockfd) 关闭套接字
Socket: 套接字描述符
成功返回
0 失败返回 -1
UDP 客户端创建流程
1 初始化网络地址结构体(服务器端)
struct sockaddr_in ser_addr ;
bzero(&ser_addr,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(50001); 服务器端口号 -------网络字节序
ser_addr.sin_addr.s_addr = inet_addr("192.168.1.230") ; 服务器点分制地址-》网络字节序 2 创建数据报套接字
Int sockfd = socket(AF_INET,SOCK_DGRAM,0);(数据报套接字) 3 发送数据到服务器端 Int sento_udp = sendto(sockfd,buf,strlen(buf)+1,0,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr_in));
(服务器地址) 4 接收服务器端的回复
Int recvfrom_udp = recvfrom(sockfd,buf, sizeof(buf),0,NULL,NULL); 5 关闭套接字
Close(sockfd);
UDP 服务器端创建流程
1 初始化网络地址结构体(服务器端)
struct sockaddr_in ser_addr ;
bzero(&ser_addr,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(50001); 服务器端口号 -------网络字节序
ser_addr.sin_addr.s_addr = inet_addr("192.168.1.230") ; 服务器点分制地址-》网络字节序 2 创建数据报套接字
Int sockfd = socket(AF_INET,SOCK_DGRAM,0);(数据报套接字) 3 绑定套接字
Int bind_udp = bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr_in));
(服务器地址) 4 接收客户端请求
struct sockaddr_in client_addr ; size = sizeof(struct sockaddr_in) int recvfrom_udp = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&size); (客户端地址) 5
回复客户端
Int sendto_udp =
sendto(sockfd,buf,recvfrom_udp,0,(struct sockaddr *)&client_addr, sizeof(struct sockaddr_in))
(客户端地址) 6 关闭套接字
Close(sockfd);
TCP 客户端创建流程
1 初始化网络地址结构体(服务器端)
struct sockaddr_in ser_addr ;
bzero(&ser_addr,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(50001); 服务器端口号 -------网络字节序
ser_addr.sin_addr.s_addr = inet_addr("192.168.1.230") ; 服务器点分制地址-》网络字节序 2 创建流式套接字
Int sockfd = socket(AF_INET,SOCK_STREAM,0);(流式套接字) 3
申请三次握手
Int connect_tcp = connect (sockfd,( struct sockaddr *)&ser_addr,sizeof(ser_addr))
(服务器地址) 4 发送数据到服务器端
Int send_tcp = send(sockfd,buf,strlen(buf) + 1,0) 5 接收服务器端的回复
Int recv_tcp = recv (sockfd,buf,sizeof(buf),0) 6 关闭套接字
Close(sockfd);
TCP 服务器端创建流程
1 初始化网络地址结构体(服务器端)
struct sockaddr_in ser_addr ;
bzero(&ser_addr,sizeof(ser_addr)); ser_addr.sin_family = AF_INET; ser_addr.sin_port = htons(50001); 服务器端口号 -------网络字节序
ser_addr.sin_addr.s_addr = inet_addr("192.168.1.230") ; 服务器点分制地址-》网络字节序 2 创建数据报套接字
Int sockfd = socket(AF_INET,SOCK_DGRAM,0);(流式套接字) 3 绑定套接字
Int bind_tcp = bind(sockfd,(struct sockaddr *)&ser_addr,sizeof(struct sockaddr_in));
(服务器地址) 4
监听客户端请求
Int listen_tcp = listen(sockfd,5)
一般为5 最大为8 5 回复客户端的三次握手请求
struct sockaddr_in client_addr ; int len = sizeof(struct sockaddr_in);
Int connectfd = accept(sockfd,( struct sockaddr *)&client_addr,&len)
( 客户端地址) 6 接收客户端请求 7 8 Int recv_tcp = recv(connectfd,buf,sizeof(buf),0); 回复客户端
Int send_tcp = send(connectfd,buf,recv_tcp,0); 关闭套接字
Close(sockfd);
Close(connectfd); 1 .TCP CS 模型
client:
socket //创建流式套接字
|
ser_addr:(struct sockaddr_in) //目标地址结构体(服务器)
|
connect()//3次握手
|
sendto/send/write
|
recvfrom/recv/read
|
.......
|
close()/shutdown()
server:
(1)循环服务器,可以多个客户端服务,但是不能在同一时刻
ser_addr :(struct sockaddr_in)//本机的地址结构体
|
socket (流式套接字)
|
bind(使套接字具有地址属性)
|
listen(创建监听队列)
| while(1) {
accept(握手建立连接,获取对方地址) | while(1) {
recvfrom/recv/read //接收对端(客户端)信息
|
sendto/send/write //向对端回射信息
} |
..... } close
(2) 并发服务器:可以同一时刻为多个客户端服务
ser_addr :(struct sockaddr_in)//本机的地址结构体
|
socket (流式套接字,sockfd)
|
bind(使套接字具有地址属性)
|
listen(创建监听队列)
| while(1) { connectfd = accept(握手建立连接,获取对方地址)
|
pid = fork()
if(pid == 0)
{
close(sockfd);
while(1)
{
recvfrom/recv/read //接收对端(客户端)信息
|
sendto/send/write //向对端回射信息
}
} close(connectfd); | ..... } close(sockfd);
2. 分析三次握手
client
server
SYN = 1 (请求标志)
seq_no = 0(client)
第一次
------------------------------>
SYN = 1(请求标志)
ACK = 1(应答标志)
seq_no = 0(server), ack_no = 1 (==seq_no(client) + 1) 第二次<------------------------------
ACK = 1(应答标志)
seq_no = 1(ack_no(server)),ack_no = 1 ( == seq_no(server) + 1) 第三次 ------------------------------>
3.数据包分析
一帧数据(TCP) = mac头 + IP头 + TCP头 + 用户数据
ttl: 数据包每经过一个路由器,如果停留的时间小于1s,ttl 减一,当ttl 小于0时数据丢弃掉
第三天
fcntl
int fcntl(int fd, int cmd, ... /* arg */ ); 获取或改变文件描述符的属性,一般我们需要改变文件状态标志位 @1 fd : 文件描述符 @2 cmd : 对文件描述符的操作(一般可以获取或者设置当前 file status flags) (F_GETFD,F_SETFD) @3 ...... : 不定参,取决于cmd @4 成功返回值取决于 cmd
失败返回-1 例如 @1
int flag = fcntl(0,F_GETFL)
查看属性有返回值 @2 fcntl(0,F_SETFL,flag | O_NONBLOCK)
添加属性无返回值
IO的特性与接口没有关系,与描述符属性有关,调用fcntl/ioctl (可以直接把你用户的命令传递到内核,可以实现对底层驱动的控制)
一 IO 模型 (4种)
1. 阻塞IO
当资源未准备好时,程序睡眠或者等待,不浪费CPU,效率低,实现非常简单,但是它是应用最广泛的IO
read(sockfd,buf,BUFF_SIZE )/recv/recvfrom
2. 非阻塞IO
当资源未准备好时,直接返回错误码(errno),不断的轮循,浪费CPU,效率高
3. 信号驱动IO(SIGIO)
一种异步的通信机制,底层(内核)向上层(用户层)发信号(SIGIO),当资源可用时,内核向当前进程发送SIGIO信号,用户捕捉(signal)此信号,读取IO资源,如果用户不捕捉,进程会被杀死
signal(SIGIO,hander);//更安全 获取套接字的原有属性
int flag = fcntl(sockfd,F_GETFL);//O_NONBLOCK 添加异步属性,文件描述符可以被多个进程打开,此时内核不知信号发给谁 fcntl(sockfd,F_SETFL,flag | O_ASYNC); 获取当前描述符对应的默认进程号(默认为0) pid = fcntl(sockfd,F_GETOWN ); 改变描述符对应的进程号
fcntl(sockfd,F_SETOWN,getpid());
4 . IO 多路复用
可以同时对多个IO控制,哪个准备好了,执行哪个
IO 多路复用:
1. 建立一个统计表:
fd_set readfds; 2. 添加fd到表中
FD_ZERO(&readfds); //将表清空
FD_SET( fd,&readfds); //将fd 加入 readfds 3 . 监测readfds 这张表(监测已经加入表的fd),会将没有就绪的fd 清0 n = select(fd+1,&readfds,NULL,NULL,NULL); //n ==>有多少fd 就绪,此时不知道哪个就绪 4. 判断哪个fd 就绪,这张表只会保存就绪的fd
FD_ISSET(fd,&readfds) == 1
就绪
FD_ISSET(fd,&readfds) == 0
未就绪
相关函数
void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set);
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 注意:描述符不受限与套接字,任何描述符都行
nfds:select()函数监视的描述符数的最大值,一般取监视的描述符数的最大值+1, 其上限设置在sys/types.h中有定义 #define FD_SETSIZE 256
readfds:select()函数监视的可读描述符集合 wtitefds:select()函数监视的可写描述符集合 errnofds:select()函数监视的异常描述符集合
timeout:select()函数监视超时结束时间,取NULL表示永久等待 返回值:返回总的位数这些位对应已准备好的描述符,否则返回-1 相关宏操作:
FD_ZERO(fd_set *fdset):清空fdset与所有描述符的关系 FD_SET(int fd, d_set * fdset):建立描述符fd与fdset得关系 FD_CLR(int fd, d_set * fdset):撤销描述符fd与fdset得关系
FD_ISSET(int fd, d_set * fdset):检查与fdset联系的描述符fd是否可以读写,返回非零表示可以读写
5. select()函数实现IO多路复用的步骤 (1)清空描述符集合
(2)建立需要监视的描述符与描述符集合的关系 (3)调用select函数
(4)检查监视的描述符判断是否已经准备好 (5)对已经准备好的描述符进程IO操作
表的存放规则:
fd_set readfds; FD_ZERO(&readfds); //将表清空
FD_SET(0,&readfds); //将0 加入 readfds
FD_SET(3,&readfds); //将3 加入 readfds
FD_SET(4,&readfds); //将4 加入 readsds
表头:
|
| 1 0 0 1 1 0 ........... ………… 0
| | | | |
|
| 0 1 2 3 4 5
1023
n = select(4+1,&readfds,NULL,NULL,NULL); 检测就绪,返回就绪个数,未就绪的清零 (由于处理器的速度很快,n通常为1)
若此时0就绪:(n = 1) 表头:
|
| 1 0 0 0 0 0 ........... ………… 0
| | | | |
|
| 0 1 2 3 4 5
1023
若此时有0 和3同时就绪(n = 2) 表头:
|
| 1 0 0 1 0 0 ........... ………… 0
| | | | |
|
| 0 1 2 3 4 5
1023
判断是那个fd就序
If(FD_ISSET(fd,&readfds) == 1)
{
。。。。。。。
}
例:
int sockfd,maxfd,n; int connectfd ,fd; char buf[BUFF_SIZE];
fd_set readfds, tempfds;
maxfd = sockfd;
FD_ZERO(&readfds);
tempfds = readfds;
while(1) { tempfds = readfds; FD_SET(sockfd,&tempfds); //如:有50 client,某一时刻只有sockfd就绪
if(-1 == (n = select(maxfd + 1,&tempfds,NULL,NULL,NULL)))
exit(-1);
for(fd = 0; fd <= maxfd ; fd ++)
{
if(FD_ISSET(fd,&tempfds)) //套接字两种都有可能就绪,如果不是sockfd,那么必定是以连接的套接字
{
if(fd == sockfd) { if(-1 == (connectfd = accept(sockfd,NULL,NULL)))
exit(-1); puts("hander shake !!! ");
FD_SET(connectfd,&readfds); //将新的客户端添加至只读表
maxfd = maxfd > connectfd ? maxfd : connectfd; //时刻保证maxfd 最大
}else //不能用if(fd == connectfd) { bzero(buf,BUFF_SIZE);
if(-1 == (n = recv(fd,buf,BUFF_SIZE,0)))
exit(-1); if(n == 0) {
FD_CLR(fd,&readfds); //将退出的客户端从只读表清除 close(fd);
if(maxfd == fd) {
while(1) {
maxfd --;
if(!FD_ISSET(maxfd,&readfds)) //maxfd 是最后一个需
要监测的
continue;
else {
break;
}
}
}
}
printf("[%d] client buf:%s ",n,buf);
}
} } }
获取套接字属性信息
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
sockfd套接字描述符 level选项级别SOL_SOCKET(man 7 solcket)(通用套接字)
IPPROTO_IP
(man 7 ip)得到选项名
IPPROTO_TCP
(man 7 tcp) optname选项名
SO_BROADCAST(广播)……
optval存放获取到的选项值的缓冲区地址&n
int n; optlen存放缓冲区长度的地
&len
int len = sizeof(n) 成功返回 0
失败返回 -1
第四天
设置套接字属性信息
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
sockfd套接字描述符
evel选项级别SOL_SOCKET
(man 7 solcket) (通用套接字)
IPPROTO_IP
(man 7 ip)得到选项名
IPPROTO_TCP
(man 7 tcp) optname选项名
SO_BROADCAST(广播)IP_ADD_MEMBERSHIP(组播)
组播结构体:struct ip_mreqn { truct in_addr imr_multiaddr; /* 组播ip
struct in_addr imr_address; /* 服务器ip
int imr_ifindex;
/* interface index */通常为0
}; optval存放需要设置的选项值的缓冲区地址&n int n = 1(打开广播), int n = 0(关闭广播) optlen存放缓冲区长度的地址
sizeof(n) 成功返回 0
失败返回 -1
Int on = 1 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) 使先前进程创建的端口能重新绑定
一单播广播组播
1. 单播:接收方为一个,用户发送的包,可以到达指定的主机,一对一的通信, 数据包经过路由器或者交换机,不经过复制,需要转发
好处:服务器可以及时的为客户端响应 坏处:如果客户端的个数太大,会造成超载
host1 -------route/swith(转发)-----------> host2 2. 广播:接收方为局域网内,所有主机, 属于一对所有,数据包经过路由器或者交换机 需要经过复制,转发,不存在CS,存在发送方,和接收方,使用UDP 注意:默认不允许发送 好处:效率高
坏处:如果大量发送会造成广播风暴
广播地址:主机号为全1,如,C类私有网络:192.168.1.255 广播MAC :FF:FF:FF:FF:FF:FF
host1------------route/swith(复制,转发) ------------------->host2
|
-------->host3
|
....
|
-------->host254
udp广播发送方:默认不允许
1). 创建数据报套接字(填充地址结构体(广播IP))
2). 设置套接字属性,允许发送广播包 (setsockopt) int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int ))(设置属性)
int on ; socklen_t len ; len = sizeof(on); getsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,&len)
2). 发送数据报到广播ip
udp广播接收方:默认允许
1). 创建数据报套接字(填充地址结构体(广播ip))
2). 绑定广播地址(ip)
3). 直接接收对方ip
3. 组播
接收方为局域网多个主机,将具有相同需求的主机加入一个组,然后组内任何一个主机的包,组内所有成员都会收到,是广播的优化 优点:有针对性,相对广播可以降低网络带宽 缺点:相对单播,缺少校错机制
组播地址:D类IP 224.0.0.0 - 239.255.255.255 组播的MAC:01:00:5e:*.*.* (IP地址的低23bit)
(获取属性) host1------route(IGMP 网络组管理协议网络层)/swith(复制,转发) ------->host2
|
------------------------->host3
|
....
|
-------->host(多个<= 254)
Udp组播发送方
1). 创建数据报套接字(填充地址结构体组播ip)
2). 直接发送组播ip
Udp组播接收方
1). 创建数据报套接字(填充地址结构体组播IP)
2). 绑定组播地址(ip)
3). 设置属性,将当前主机ip加入组(IGMP) //需要路由器
struct ip_mreqn mulgroup; bzero(&mulgroup,sizeof(mulgroup)); mulgroup.imr_multiaddr.s_addr = inet_addr(组播ip);
mulgroup.imr_address.s_addr = inet_addr(本机ip); mulgroup.imr_ifindex = 0;
setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mulgroup,sizeof(mulgroup))
4). 直接接收对方ip
第五天: 说明:
网络中套接字通常是,当没有相应资源时是阻塞的,如果有资源可读,就会直接返回 网络中环境是异常复杂的,这个时候我们对异常处理,需要超时检测
一超时检测
1. 设置套接字选项
Struct timeval tv; 套接字超时属性 (结构体)
tv.tv_sec = 3; 秒
tv.tv_usec = 1000; 微秒
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)) connectfd = accept(sockfd,NULL,NULL) connectfd 继承sockfd的属性(这里应用的是超时属性) if(errno == EAGAIN)continue;
2. select
//如果没有任何一个fd就绪则超时,超时返回0,每次超时之后,tv值不会重置,需要用户自己重置
struct timeval tv; tv.tv_sec = 2; tv.tv_usec = 0; n = select(sockfd + 1,&readfds,NULL,NULL,&tv)) if(n == 0) {
printf("timeout %d .... ",++count);
continue; }
3. alarm信号 //特性不会阻塞,会更新
/* function: 中断当前进程阻塞的系统调用,在哪里阻塞在哪里中断
signum: 捕捉的信号
act: 设置之后的信号属性
oldact: 获取先前默认的属性
*
int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int); //signal 的信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //sigaction最早的信号处理函数
sigset_t
sa_mask; //信号屏蔽码,可以屏蔽指定信号
int
sa_flags; //信号属性
void (*sa_restorer)(void); //linux 不支持
};
二 UNIX 域套接字编程
1. 本地(本机)进程间通信
2. 不经过OSI /TCP/IP 体系结构,不存在打包和拆包过程
3. 可以完全套用TCP/UDP CS 模型
练习: 实现UNIX本地进程通信
三 tftp 实现
第五篇:听课笔记
听
课
笔
记
教学内容:苏教版小学语文第七册《九色鹿》 教学时间:2005年11月
教
师:海安县实验小学
仲剑锋 教学过程:
一、 复习巩固
1、回忆主要内容
2、九色鹿给你留下了什么印象? 师引导:第一小节呢?
指名,相机板书:美丽善良 勇于救人
随感:导入有些困难,学生平时积累比较匮乏。
二、 精读课文
1、通过你的朗读,调达好象是一个什么样的人? 指名:(1)知恩图报
(2)老实 课件出示:千恩万谢
知恩图报 感恩戴得 有恩必报
随感:很有必要的出示,是帮助学生积累词语的好机会,适当的读背记忆也许效果会好些。
2、如何读好这些词?(要读出敬佩之情) 自由读、指名读 师生评价。
3、他到底是不是这样一个人呢? (1) 指名读第六小节 师指导:王妃的高兴要读出来 再指名读。
(2) 指名读第七小节 (3) 指名读第八小节 师指导:读出春光的美丽
随感:通过指导学生朗读来体会人物角色的特点,这是阅读教学中比不可少也不容忽视的环节。
4、调达是怎么做的?指名读句。
出示:调达看了皇榜,心想发财的机会来了。 (1) 他眼前似乎看见了什么?心里在想什么? (指导体会财迷心窍的样子) 指导读。
(2) 着重推敲“就“
调达当时只想到了什么?(金钱) 他忘记了什么?(别人的恩) 指导理解词语“见利忘义“。
随感:很令人叫绝的理解词语方法,通过联系文本内容来辅助理解,学生会感到很轻松。
(3) 此时你觉得调达是个怎样的人? 出示词语:见利忘义
忘恩负义 背信弃义 恩将仇报
指名读、指导读 自由读背词语。
5、了解了他的为人,能读出不同的见解出来吗? 出示语句:„„“谢谢你的救命之恩„„” 指名读(生1读得很虚伪) 师:同意他的观点吗?
生2:不同意,当时他还不知道有发财的机会,把他读得太卑鄙了。 生读。 „„
师总结:„„读书要有自己的见解„„
随感:新课程强调不能拘泥于文本,而是学会跳出文本内容,以学生自己独特的理解为重心,注重学生的阅读感受,这里教者引导辩论,让学生大胆读出了自己的收获。
6、当调达带着国王的军队来到九色鹿面前,九色鹿心情怎样?(气愤) 出示语句 指名读。 师生评价。
九色鹿这番话有几层意思?指名说。 (1) 第一层:气愤 指名读,生评价,再读 重点词“竟然”(出乎意料) (2) 第二层:
指名读,师评价(字字千钧,义正言辞) 有不同的读法吗?能让国王知道自己错了吗? 师范读:这样读有道理吗?能帮我说说我的道理吗? (要尊重国王) 自由读,指名读。
随感:阅读教学中,教师的示范朗读是很有必要的,从而为学生指引正确的情感方向。
7、再用一些词来赞美九色鹿? 相机板书:临危不乱
聪明过人
8、指名读国王的做法
9、练笔:
九色鹿,我(称赞、敬佩、提醒)你:(
)。 调达,我(斥责、讨厌、劝告)你:(
)。 师生交流
三、 总结、作业:
师朗诵名言:
1、滴水之恩,当以涌泉相报。
2、人的最大美德莫过于诚信,诚信是人之根业之本。
作业:搜集有关诚信的名言警句。