NTUE-CS102 板


LINE

※ 引述《game0416 (凤狼)》之铭言: : 人参,我觉得下份作业比较令人恐惧..吧 每过一段时间,回头看自己讲的话就觉得很可怕,真的 没道义的才写这作业,当然应该全员装死说不会写的嘛对不对 ......所以我没道义,明明讲了不写,结果还是写到一个程度写不下去这样_A_ 就变成我现在对几大雷科感到 非 常 有 压 力 有没有人可以整理考古题或泄题详解借我用orzz 好,所以首先先提一下 文章代码(AID): #1A8y1irR (NTUE-CS100) 这串,我觉得从 文章代码(AID): #1A9i0Nah (NTUE-CS100) 开始看算刚好,看人情况需求 还剩两天,有心可以试着跟我一样拿个80%表示诚意(?) 不变的,可以很有种去几个人的资料夹干作业档。 -- 因为我整体前50%的分数也算参考那整篇,所以先讲解那整串有什麽 1.学长自写的几个函式,分别为 void writeInt(int sockfd, int number) 传送整数 int readInt( int sockfd ) 接收整数 void writeString(int sockfd, char *buffer) 传送字串 (替代原Writen) void readString(int sockfd, char *buffer ) 接收字串 (替代原Readline) void serv_dir(int sockfd) 伺服端DIR功能 void cli_dir( int sockfd ) 客户端DIR功能 嗯...需要看这篇教学的我觉得可能没有足够时间理解这些是什麽 所以就随便看看旁边的中文注解就好,下面我觉得也没什麽好写详细的了 原本那篇就蛮清楚的 全班看得懂的大概不超过八个人,这八个我已知三个到刚才都是一起死死(?) 附上原档案内容.c档案..借用国外学校资源(?) http://www.cs.odu.edu/~cs779/stevens2nd/tcpcliserv/tcpcli01.c http://www.cs.odu.edu/~cs779/stevens2nd/tcpcliserv/tcpserv01.c -- 2.code部分范例 这个我接下来全文胡乱说明这样,因为分伺服客户两端,希望各位还能看懂 然後追加一点东西hmm 首先,在serv跟cli的main之前都复制贴上前面的函式,就照上一页顺序引入 伺服端可以不引入客户端dir,反之亦同 从serv开始...main里头,先直接看到 str_echo(connfd); /* process the request */ 这段,这段是接收资料做处理的部分,就从这里开始修改 我没特别写太漂亮函式另外呼叫,就直接从取代这行开始做 取出原函式内下面这段开始做修改 for ( ; ; ) { if ( (n = Readline(sockfd, line, MAXLINE)) == 0) //读不到资料 return; /* connection closed by other end */ Writen(sockfd, line, n); } -- 呃,应该是只要无穷回圈的部分 for ( ; ; ) { } 第一步是接收连上的cli传来讯息,所以就readString (connfd,cmd)读传来资料 : 请记得宣告一个char cmd[1000];来当命令存放 再来针对传来的资料做各个判断 原文内是写成 if (strcmp(cmd,"dir")==0) : cmp比较,全部相同回传0...就辨认字串是不是dir 因为cli输入用的stdin好像有追加到後面换行符号,所以直接用有点问题,请改成 if (strncmp(cmd,"dir",3)==0) : ncmp可以指定只比前n个字元,会比较没有判断问题 判断是传来dir命令,就能用学长写好的serv_dir传回资料夹内容 这边要记得,serv_dir(int sockfd)有用到DIR类别,档头要引入 #include <dirent.h> 下页接这部分的cli要改多少 -- cli这部分比较不同,是改str_cli(FILE *fp, int sockfd)的内容 一样只要留下 while (Fgets(sendline, MAXLINE, fp) != NULL) { } 就够了,与伺服端相反,这边第一件事是送资料出去 原本程式上面,输入进来的东西是存在 sendline 这个变数 因此,送出资料的writeString引数为(sockfd, sendline) 送出之後,让cli自己针对送出的命令做不同行为 一样用strncmp判断送出的命令是什麽,然後呼叫cli端dir函式 if (strncmp(sendline,"dir",4)==0) cli_dir(sockfd); 至此,编译正常,能连上50%分数差不多get 啊不要跟我一样忘记编译指令就好 cc -L/tmp -o tcpserv01 tcpserv01.c -lunp -- 再来,exit 10%不拿白不拿 在前文if後面,追加 else if (strncmp(命令变数,"exit",4)==0) 嗯...看清楚code就知道,离开回圈/函式後 外面的exit(0); 会帮你断线 所以两边都一样一个break 跳出回圈就完成了 好,所以再来有两个选择,一是get一个是特殊功能 我搞不懂get怎麽写,所以转头先干掉特殊功能 这里个人推荐rm,後面只会有一个引数档名,相对好做非常多 而且只要在serv做字串处理,cli这边射後不理就好了 -- 所以说,cli这边大概长成 else if (strncmp(命令变数,"rm ",3)==0) ; 就没有了,主要看serv端要怎麽做字串处理 开头一样要抓命令,if判断式内容cli一样 因为我们以前用过一个函式叫做system("pause"); 其实是对系统命令列下pause : 开始 执行 cmd pause就会看到熟悉的东西(y) 这里我们要利用这个函式做rm...先想命令是长怎样 比方要删除一个a.txt,下的指令就是rm a.txt 也就是说,我期待会有system("rm a.txt")这样的东西出现 然後在serv端执行就有了 system()的引数是个字串,所以有个char * 塞进去就能用 要如何生出这样的字串,就是用strcpy strcat strstr -- 首先,宣告一个临时用的变数char tmp[1000]; 用来存放我们要做出来的这个命令句 第一步,因为确定这个命令开头一定是"rm" 所以用strcpy(tmp,"rm")把tmp设定好 下一步,要把档名接上来 字串连接是strcat(字串A,字串B) 可是在这之前,要先找到档名是什麽 所以用strstr()找,在cmd里头哪边开始是空白 : rm a.txt : ↑ 这个空白 strstr会回传一个char*,指向空白的位置 空白位置+1,就会是档名起点,把空白留下,跟前面设好的rm摆在一起 恰巧就会变成"rm a.txt" 因此,这段其实就只有strcat(tmp,strstr(cmd," ")); 最後system("tmp");就做完rm功能 对,就这样四行。 -- 所以就是这样的80% 啊...不对,我们还有个作业规范要谈 假设 server 执行档名称为 tcpserv01, 则 server 端执行的方式为 tcpserv01 [server port] 假设 client 执行档名称为 tcpcli01, 则 client 端执行的方式为 tcpcli01 [server IP address] [server port] 这边是以前提过,可是大概都忘记的东西 看一下int main() 改写成int main(int argc, char **argv) argc会存总共有多少个引数,argv这个字串阵列会逐个将引数分别存入 只是argv[0]会是执行档案本身 : 详细goooooogle就有了,这边不想提太多 -- 针对serv这部分 引数只有一个port 所以把原本指定port的地方 servaddr.sin_port = htons (5566); 把引数放进去变这样 servaddr.sin_port = htons (argv[1]); ...是错的,编译不会过 因为这边吃的是int,argv[1]是个字元阵列 拿起我们一上期末考题出过的atoi() 写成 servaddr.sin_port = htons (atoi(argv[1])); 这样就ok cli端port设定同,唯引数放在第二个,所以是atgv[2] IP那边没有因为编写方便改的话就不用改,原本就写好了这样 -- 所以就这样完成,get不会写放掉30%,实质20%这样 我还是不懂为什麽要因为随口说的话而搞到现在 写这东西包含这个乱糟糟的教学从无到有摸了六小时Orz 然後看完教学的用不到一小时就该做出来,跟我拿差不多的分数 这世界到底怎麽了(趴 我觉得我对不起同个时间点跟我一起开始搞的,比我还要早几天开工写不出来的的两三人 因为你们拚死浪费了两天做不出结果,会因为我这篇让其他人可以爽爽拿分 非常抱歉。 -- 所恐惧的,不是没有知识的大众  所憎恨的,不是深沉幽暗的人心 而是自以为是的思考之声 而是自恃甚高的执法者 所毁灭的,不是温馨和谐的世界 这是我最後的期许,没有愤怒、没有悔恨 而是自欺欺人的梦境 只剩下,浑沌的死亡呼吸                节自 新月神话-弑王者 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.184.23.107
1F:→ game0416:因为是写完赶着写,有问题可以今天明天我在学校时问问 06/15 04:38
2F:→ game0416:大概有老马少写或挖了洞我也不知道了 06/15 04:38
3F:推 dosomethnig:大大可以讲中文吗 我崩溃了 06/15 04:44
4F:推 Arashinoon:感谢大大无私分享 好帖 我顶 06/15 06:14
5F:推 CaptainWill:未看先猜楼上&楼楼上看不懂 06/15 06:14
6F:推 jerry771210:加油吧....当初也很痛苦+1 06/15 07:17
7F:→ jerry771210:但是写完对socket programing有些了解 06/15 07:18
8F:推 j2612280:冏 06/15 09:31
9F:→ game0416:晚点不会在,先谢chchwy学长指导 06/15 16:48
※ 编辑: game0416 来自: 120.127.47.30 (06/16 13:55)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP