课程总结汇报 by team12 方宇卿 &黄睿 - mengning/remoteapd GitHub Wiki


  网络程序这门_难忘的课程终于落下帷幕了。之所以说它难忘_,是因为这门课有以下几个_鲜明_的特点:

  • 没有老师枯燥无味的照本宣科,而是个小组通过presentation的方式集思广益,使得枯燥的技术因为这种互动交流的方式变得_鲜活_起来了。
  • 老师没有强制性地定量布置作业,而是_鼓励同学尽可能地去挖掘,去探索新的知识,并且把学到的东西和大家交流,这就使得学习新知识变得积极主动_,而不是被动地陷入题海中。
  • 课程虽然定位技术前沿,但没有像技术讲座一样,满篇理论,空话,大话,而是兼顾了_理论和实践,鼓励大家通过结对编程,基于github工作流的迭代开发,是软件工程的最佳实践_。
  • 并没有通过考试这种一战定生死的考察方式,而是通过多纬度,多方面去考察每个人的_功劳和苦劳_,使得考察结果更加准确,信服。

  下面从以下三个方面对本课程做一个总结汇报:

  • 学习心得
  • 功劳和苦劳
  • 核心工作展示

##1. 学习心得: 通过这门课,我们学到的东西比较杂,在此稍做整理.

1.1 学到了什么?:

  1. 学会了阅读论文的能力(How to read a paper, ACM CCR 2007)。

  2. 巩固了网络基础知识(The Design Philosophy of the DARPA Internet Protocols),了解了网络架构的发展史和现状。

  3. 学会了对开源软件代码进行深入分析的能力,学会利用工具(Source Insight)的同时,利用从main函数自顶向下的分析方法。(openvswitch开源代码和hostapt开源代码)

  4. 理解了无线局域网的工作原理(Building Programmable Wireless Networks:An Architectural Survey),理解了免费wlan难以产生的原因和如何通过技术手段权衡这个问题(利用hostpad建立无线ap)

  5. 学习了git的中心化工作流,各个小组通过提交各自独立的里程碑进行了高效的沟通和协作,最终通过几轮_迭代得到了最终的版本,这也是版本控制在软件工程中的极佳实践_(我的github账号)。

  6. 学会了利用github的wiki功能写博客,并且利用github的page功能书写属于自己的_静态页面博客_(黑客与画家简评

  7. 并且学会了_markdown_语言书写出格式良好的程序说明文档(hostapd配置说明

  8. 对linux下c编程以及makefile有了比较深入的理解,(openvswitch的编译,hostapd编译)

  9. 进一步加强了presentation的能力,能够与别人_分享_自己的idea。

  10. 最后,也是最重要的:学到_学习新东西的方法_:如何又快又好地去学习一个对于自己完全陌生东西——也就是一种学习方法,这点收益良多!


###1.2 一些心得

  1. 通过阅读和翻译两篇论文。从第一篇The Design Philosophy of the DARPA Internet Protocols中学到了互联网设计的理念,以及当代互联网架构中存在的一些不足,这篇文章不但让我把基础的网络知识重新梳理了一遍,而且对网络发展提出了新的构想,为后续关于SDN的学习起到了承上启下的作用,无论网络架构的发展如何日新月异,这篇文章仍然是一篇贯古通今的佳作。
  2. 第二个任务是研读Open vSwitch开源软件代码,从来没有阅读过一个开源软件代码的我们来说是一个巨大的挑战,从一开始的一头雾水,到发现Source Insight这个神奇工具的兴奋,再到面对一个上万行代码文件的一片迷茫。。。从功劳来说,我们的两次阅读代码经历都不是很成功,但是,相比第一次,第二次的hostapd代码阅读就好了很多,从main函数开始,自顶向下,层层剥茧,当真理一下子出现在面前,那种兴奋的感觉就好像跑了一场马拉松后终于到了终点。
  3. 其实整个课程下来,我在方法论和工具方面的收获要比实际真正coding要多一些,我自学了git,并且把自认为可以拿得出手的项目全部push到github平台上,并且严格控制自己的代码版本,坚持下来后其实就是对软件工程理论的一次最佳实践。

2.功劳和苦劳:

1) 两次上台presentation(组内共同完成) work

2) 两次论文翻译

3) The Design Philosophy of the DARPA Internet Protocols全文批注,仅仅批注修改的字数达3000余字。 批注1批注2

4) 精心书写Hostapd配置学习心得并提交到github上,内容上有自己的理解,排版上更是用markdown标记语言精心润色。 wikihost

5) Github上的first commit(尽管成果不多) commit1

6) 认真研读了cloudapd代码并且成功实现通信。 success

7) 积极参与群内讨论,与小伙伴们交流技术问题(这个算不算?囧)。 qun


3.核心工作展示:

###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;
}
⚠️ **GitHub.com Fallback** ⚠️