作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Wed Jun 15 04:33:18 2011
※ 引述《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)