COS461是普林斯顿大学的计算机网络课程:https://github.com/PrincetonUniversity/COS461-Public

课程实现

assignment1

assignment1

这次作业的任务大概分为两大部分:搭建环境和socket编程。

搭建环境

按照教程一步一步搭建即可,期间可能会有各种问题,这时候Google或者百度解决即可。

socket编程

编程部分分为两部分,c语言版本和python或者go版本的server和client,我这里使用go语言。

建议先仔细看编程要求:

  1. server端需要死循环等待client端连接
  2. server端需要把从客户端传来的数据输出到标准输出,之后不需要做任何其他事情
  3. server端注意不要使用fork!!!
  4. client端需要读取标准输入,直到读到EOF
  5. client端只需要发送一次消息即可,发送完即可退出,不需要死循环!!!

C语言部分

  • 课程里给了一个教程地址:https://beej.us/guide/bgnet/html/

  • 可以看这个教程快速熟悉Linux系统编程和socket编程的知识,如果想系统学习,建议去看《Unix网络编程》,入门必备。

  • 其实大概框架可以参考上面的教程的例子写出来,比较麻烦的部分是输入输出部分

贴一下核心代码:

  • server-c.c:
  while (1){ // main accept() loopsin_size = sizeof their_addr;new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);if (new_fd == -1){perror("accept");continue;}char buf[RECV_BUFFER_SIZE];n = recv(new_fd, buf, RECV_BUFFER_SIZE, 0);while (n > 0){fwrite(buf, n, 1, stdout);fflush(stdout);n = recv(new_fd, buf, RECV_BUFFER_SIZE, 0);}close(new_fd);}
  • client-c.c:
  numbytes = fread(buf, 1, SEND_BUFFER_SIZE, stdin);while (numbytes > 0){if (send(sockfd, buf, numbytes, 0) == -1){fprintf(stderr, "client: failed to send\n");close(sockfd);return 1;}numbytes = fread(buf, 1, SEND_BUFFER_SIZE, stdin);}
  • 其余部分详见代码
  • 写完这部分代码,就可以跑测试脚本了,如果顺利的话能通过前5个测试用例。

Go语言部分

同理,麻烦的是处理输入输出。

贴一下核心代码:

  • server-go.go:
func server(server_port string) {l, err := net.Listen("tcp", "127.0.0.1:"+server_port)if err != nil {log.Fatal(err)}defer l.Close()for {conn, err := l.Accept()if err != nil {log.Fatal(err)}// 注意这里不能起goroutine去执行,不然test10和test15过不了handleConn(conn)}}func handleConn(conn net.Conn) {defer conn.Close()var n int64 = 1var err errorfor n > 0 {// 用io.Copy最省事,用其他输入输出函数都会有些问题QwQn, err = io.Copy(os.Stdout, conn)if err != nil {log.Fatal(err)}}
}
  • client-go.go:
func client(server_ip string, server_port string) {conn, err := net.Dial("tcp", server_ip+":"+server_port)if err != nil {log.Fatal(err)}defer conn.Close()input := bufio.NewScanner(os.Stdin)// 默认Scanner是ScanLine,这里需要改成ScanBytesinput.Split(bufio.ScanBytes)for input.Scan() {_, err = conn.Write(input.Bytes())if err != nil {log.Fatal(err)}}
}
  • 最后跑测试用例:
$ ./test_client_server.sh go 11111
================================================================
Testing C client against C server (1/4)
================================================================1. TEST SHORT MESSAGESUCCESS: Message received matches message sent!
________________________________________2. TEST RANDOM ALPHANUMERIC MESSAGESUCCESS: Message received matches message sent!
________________________________________3. TEST RANDOM BINARY MESSAGESUCCESS: Message received matches message sent!
________________________________________4. TEST SERVER INFINITE LOOP (multiple sequential clients to same server)SUCCESS: Message received matches message sent!
________________________________________5. TEST SERVER QUEUE (overlapping clients to same server)SUCCESS: Message received matches message sent!================================================================
Testing Go client against Go server (2/4)
================================================================6. TEST SHORT MESSAGESUCCESS: Message received matches message sent!
________________________________________7. TEST RANDOM ALPHANUMERIC MESSAGESUCCESS: Message received matches message sent!
________________________________________8. TEST RANDOM BINARY MESSAGESUCCESS: Message received matches message sent!
________________________________________9. TEST SERVER INFINITE LOOP (multiple sequential clients to same server)SUCCESS: Message received matches message sent!
________________________________________10. TEST SERVER QUEUE (overlapping clients to same server)SUCCESS: Message received matches message sent!================================================================
Testing C client against Go server (3/4)
================================================================11. TEST SHORT MESSAGESUCCESS: Message received matches message sent!
________________________________________12. TEST RANDOM ALPHANUMERIC MESSAGESUCCESS: Message received matches message sent!
________________________________________13. TEST RANDOM BINARY MESSAGESUCCESS: Message received matches message sent!
________________________________________14. TEST SERVER INFINITE LOOP (multiple sequential clients to same server)SUCCESS: Message received matches message sent!
________________________________________15. TEST SERVER QUEUE (overlapping clients to same server)SUCCESS: Message received matches message sent!================================================================
Testing Go client against C server (4/4)
================================================================16. TEST SHORT MESSAGESUCCESS: Message received matches message sent!
________________________________________17. TEST RANDOM ALPHANUMERIC MESSAGESUCCESS: Message received matches message sent!
________________________________________18. TEST RANDOM BINARY MESSAGESUCCESS: Message received matches message sent!
________________________________________19. TEST SERVER INFINITE LOOP (multiple sequential clients to same server)SUCCESS: Message received matches message sent!
________________________________________20. TEST SERVER QUEUE (overlapping clients to same server)SUCCESS: Message received matches message sent!================================================================TESTS PASSED: 20/20

大功告成!

COS461-普林斯顿大学计算机网络课程-assignment1实现相关推荐

  1. 计算机网络课程设计课件,中国石油大学计算机网络课程设计

    1.中 国 石 油 大 学 远 程 教 育 学 院 2011 - 2012 - 3 学 期 计 算 机 网 络 课 程 设 计 大 作 业题 目 : 湖 南 工 学 院 校 园 网 设 计专 业 : ...

  2. 大学计算机课程第六章答案,大学计算机网络课程第六章.ppt

    大学计算机网络课程第六章.ppt 第6章 文件管理 §6.1 文件的概念 §6.1 文件的概念 §6.1 文件的概念 §6.1 文件的概念 §6.1 文件的概念 §6.1 文件的概念 §6.1 文件的 ...

  3. 石油大学计算机网络课程设计(在线考试答案)

    中国石油大学(北京)远程教育学院 <计算机网络课程设计>大作业说明 1. 目的:本大作业的目的是希望同学们学以致用,能够将课程上教授的理论内容在自己的工作生活实践中加以印证,理解计算机网络 ...

  4. 计算机网络相关的课程设计题目,计算机网络课程设计专业论文题目 计算机网络课程设计专业论文题目怎么拟...

    汇总了[100道]与计算机网络课程设计相关论文选题,为广大毕业生和职称者推荐计算机网络课程设计专业论文题目,解决在校大学生不知道计算机网络课程设计专业论文题目怎么拟等相关问题! 一.比较好写的计算机网 ...

  5. 计算机网络课题目,计算机网络课程学论文选题 计算机网络课程论文题目怎么取...

    [100道]计算机网络课程学论文选题供您参考,希望能解决毕业生们的计算机网络课程论文题目怎么取相关问题,选好题目那就开始写计算机网络课程论文吧! 一.比较好写的计算机网络课程论文题目: 1.以任务驱动 ...

  6. 【美国留学大学】--普林斯顿大学

    学校名称:Princeton University 中文名称:普林斯顿大学 所属地区:北美洲 所属国家:美国 所在位置:新泽西州 所在城市:普林斯顿 学校类别:大学 学校性质:私立 申请难度:五星 教 ...

  7. 计算机网络课程毕业设计论文,计算机网站毕业论文范文

    计算机毕业论文 在包罗万象的网络世界里,要制作一个具有学校特色的网页是需要一定方法与技巧.下面我对学校网页的制作浅谈自己的几点意见. 一:定位好网站的主题和名称 1.主题要有特色而且精巧.定位要有学校 ...

  8. 计算机强化课程计算机网络,大学计算机网络技术课程教学改革

    [摘要]在课程体系建设上,要将计算机网络技术课程理论内容与实践应用相结合,在高校应与学生的未来职业生涯建立必然联系.在计算机网络教学理念上,不断开拓思路,合理调整课程体系结构,从而实现课程改革的创新. ...

  9. 计算机变式教学,试论大学公共计算机网络课程变式练习.pdf

    第32卷第6期 吉林工商学院学报 V01.32,No.6 JOURNAI,OFBUSINESS 2016年12月 JILIN ANDTECHNOLOGYCOLLEGE Dec.2016 试论大学公共计 ...

最新文章

  1. android 读写文件权限_flutter 文件下载
  2. 牛客 - 树上博弈(思维)
  3. C#自定义数字格式字符串
  4. 面试稳了!BATJ 等大厂 400+ 道面试题全汇总!
  5. 地理信息安全在线培训考试系统题库-多选题
  6. 华为搜索引擎Petal与Google的区别
  7. c语言知识点总结300字,大二学年自我总结300字 .doc
  8. 互联网早报:微信内测深度清理功能内存,可一键清理缓存
  9. V2X车联网-学习整理笔记
  10. 我的Web安全学习之路
  11. c#MVC文件(图片,word,excel,zip等)批量上传
  12. 你感受过VR视频故事线吗?适用于哪些方面?
  13. 华为电脑Linux进pe,华为 matebook X Pro用U盘PE重装系统步骤(xp)
  14. USB Full-Speed 基础波形
  15. 清华大学企业资本运营总裁高级研修班
  16. OpenGL报错#error: gl.h included before glew.h
  17. Cuphead开发人员针对Nintendo Switch进行优化的技巧
  18. CocoaPods安装出现的错误
  19. Hive综合案例练习(中级):环境数据准备
  20. 全志平台设备固件升级方法

热门文章

  1. 当代人物杂志封面人物杨剑昌新春寄语:仗剑维权,鞠躬尽瘁
  2. 开机卡logope引导不了_开机卡LOGO不要慌小匠来帮忙—常见的开机卡LOGO问题排查方法...
  3. 【分治法】中位数问题,C++
  4. C/C++项目源码——五子棋
  5. win10系统查看组件服务器,win10系统查看邮箱服务器信息的技巧介绍
  6. 【原创】Unity3D 模仿《魔兽世界》的第三人称角色控制器
  7. ZigBee无线通讯技术
  8. 2022-D^3CTF-Web-Writeup
  9. 飞步科技 x 焱融 YRCloudFile:大幅提升训练效率,开启智驾新纪元
  10. Android9.0支持exFat格式u盘识别