课程总结汇报 by team12 方宇卿 &黄睿 - mengning/remoteapd GitHub Wiki
网络程序这门_难忘的课程终于落下帷幕了。之所以说它难忘_,是因为这门课有以下几个_鲜明_的特点:
- 没有老师枯燥无味的照本宣科,而是个小组通过presentation的方式集思广益,使得枯燥的技术因为这种互动交流的方式变得_鲜活_起来了。
- 老师没有强制性地定量布置作业,而是_鼓励同学尽可能地去挖掘,去探索新的知识,并且把学到的东西和大家交流,这就使得学习新知识变得积极主动_,而不是被动地陷入题海中。
- 课程虽然定位技术前沿,但没有像技术讲座一样,满篇理论,空话,大话,而是兼顾了_理论和实践,鼓励大家通过结对编程,基于github工作流的迭代开发,是软件工程的最佳实践_。
- 并没有通过考试这种一战定生死的考察方式,而是通过多纬度,多方面去考察每个人的_功劳和苦劳_,使得考察结果更加准确,信服。
下面从以下三个方面对本课程做一个总结汇报:
- 学习心得
- 功劳和苦劳
- 核心工作展示
##1. 学习心得: 通过这门课,我们学到的东西比较杂,在此稍做整理.
-
学会了阅读论文的能力(How to read a paper, ACM CCR 2007)。
-
巩固了网络基础知识(The Design Philosophy of the DARPA Internet Protocols),了解了网络架构的发展史和现状。
-
学会了对开源软件代码进行深入分析的能力,学会利用工具(Source Insight)的同时,利用从main函数自顶向下的分析方法。(openvswitch开源代码和hostapt开源代码)
-
理解了无线局域网的工作原理(Building Programmable Wireless Networks:An Architectural Survey),理解了免费wlan难以产生的原因和如何通过技术手段权衡这个问题(利用hostpad建立无线ap)
-
学习了git的中心化工作流,各个小组通过提交各自独立的里程碑进行了高效的沟通和协作,最终通过几轮_迭代得到了最终的版本,这也是版本控制在软件工程中的极佳实践_(我的github账号)。
-
学会了利用github的wiki功能写博客,并且利用github的page功能书写属于自己的_静态页面博客_(黑客与画家简评)
-
并且学会了_markdown_语言书写出格式良好的程序说明文档(hostapd配置说明 )
-
对linux下c编程以及makefile有了比较深入的理解,(openvswitch的编译,hostapd编译)
-
进一步加强了presentation的能力,能够与别人_分享_自己的idea。
-
最后,也是最重要的:学到_学习新东西的方法_:如何又快又好地去学习一个对于自己完全陌生东西——也就是一种学习方法,这点收益良多!
###1.2 一些心得
- 通过阅读和翻译两篇论文。从第一篇The Design Philosophy of the DARPA Internet Protocols中学到了互联网设计的理念,以及当代互联网架构中存在的一些不足,这篇文章不但让我把基础的网络知识重新梳理了一遍,而且对网络发展提出了新的构想,为后续关于SDN的学习起到了承上启下的作用,无论网络架构的发展如何日新月异,这篇文章仍然是一篇贯古通今的佳作。
- 第二个任务是研读Open vSwitch开源软件代码,从来没有阅读过一个开源软件代码的我们来说是一个巨大的挑战,从一开始的一头雾水,到发现Source Insight这个神奇工具的兴奋,再到面对一个上万行代码文件的一片迷茫。。。从功劳来说,我们的两次阅读代码经历都不是很成功,但是,相比第一次,第二次的hostapd代码阅读就好了很多,从main函数开始,自顶向下,层层剥茧,当真理一下子出现在面前,那种兴奋的感觉就好像跑了一场马拉松后终于到了终点。
- 其实整个课程下来,我在方法论和工具方面的收获要比实际真正coding要多一些,我自学了git,并且把自认为可以拿得出手的项目全部push到github平台上,并且严格控制自己的代码版本,坚持下来后其实就是对软件工程理论的一次最佳实践。
1) 两次上台presentation(组内共同完成)
2) 两次论文翻译
3) The Design Philosophy of the DARPA Internet Protocols全文批注,仅仅批注修改的字数达3000余字。
4) 精心书写Hostapd配置学习心得并提交到github上,内容上有自己的理解,排版上更是用markdown标记语言精心润色。
5) Github上的first commit(尽管成果不多)
6) 认真研读了cloudapd代码并且成功实现通信。
7) 积极参与群内讨论,与小伙伴们交流技术问题(这个算不算?囧)。
###3.1 Wrapper Server 初始化的地方: static void * wpa_driver_nl80211_init(void *ctx, const char *ifname, void *global_priv) { i80211ext_server_init();//初始化server struct wpa_driver_nl80211_data *drv; struct rfkill_config *rcfg; struct i802_bss *bss; }
###3.2 监听验证的地方,这里加入send_to_client函数,把得到的验证BUF发送到client端: static void handle_eapol(int sock, void *eloop_ctx, void *sock_ctx) { struct wpa_driver_nl80211_data *drv = eloop_ctx; struct sockaddr_ll lladdr; unsigned char buf[3000]; int len; socklen_t fromlen = sizeof(lladdr); len = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&lladdr, &fromlen); if (len < 0) { perror("recv"); return; } send_to_client(buf,sizeof(buf));//发送BUF给client
if (have_ifidx(drv, lladdr.sll_ifindex))
drv_event_eapol_rx(drv->ctx, lladdr.sll_addr, buf, len);
}
###3.3 Wrapper:
int i80211ext_server_init()
{
int fd = -1;
int ret = -1;
char buf[MAX_BUF_LEN];
struct sockaddr_in serveradd;
struct sockaddr_in clientaddr;
socklen_t clientaddr_len = sizeof(struct sockaddr);
serveradd.sin_family = AF_INET;
serveradd.sin_port = ntohs(PORT);
serveradd.sin_addr.s_addr = inet_addr(IP_ADDR);
bzero(&(serveradd.sin_zero),8);
fd = socket(PF_INET,SOCK_STREAM,0);
assert(fd != -1);
ret = bind(fd,(struct sockaddr *)&serveradd,sizeof(struct sockaddr));
if(ret == -1)
{
fprintf(stderr,"Bind Error %s:%d\n",FILE,LINE);
return -1;
}
ret = listen(fd,MAX_CONNECT_QUEUE);
assert(ret != -1);
newfd = accept(fd,(struct sockaddr *)&clientaddr,&clientaddr_len);
return 1;
}
int send _to_client(char * a,int len)
{
return write(newfd,a,len);
}
###3.4 Client.c 客户端接受信息: #include<stdio.h> #include<arpa/inet.h> /* internet socket */ #include<string.h> #include<assert.h> #define PORT 5001 #define IP_ADDR "127.0.0.1" #define MAX_CONNECT_QUEUE 1024 #define MAX_BUF_LEN 1024
int main()
{
int sockfd = -1;
char buf[MAX_BUF_LEN];
struct sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(PORT);
serveraddr.sin_addr.s_addr = inet_addr(IP_ADDR);
memset(&serveraddr.sin_zero, 0, 8);
sockfd = socket(PF_INET,SOCK_STREAM,0);
assert((sockfd != -1));
int ret = connect(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr));
if(ret == -1)
{
fprintf(stderr,"Connect Error,%s:%d\n",__FILE__,__LINE__);
return -1;
}
while(1)
{
ret = read(sockfd,buf,MAX_BUF_LEN);//不断接收从802.11ext中发送的buffer信息
if(ret>0)
printf("Server send:%s\n",buf);
}
close(sockfd);
return 0;
}