小春网

 找回密码
 注册账号
查看: 1779|回复: 14
收起左侧

[IT 交流] 紧急求救。C语言作业。TCP/IP通信型クイズ出題クライアントプログラム。拜托。

[复制链接]
发表于 2010-4-18 17:59:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册账号

x
朋友们你们好。我是来寻求帮助的。老师出了C语言的一道通信题,我实在不会做。
其实题挺有意思的。可惜我没悟出它的解法。
希望高手们可以抽空帮我看一下,小妹在三感谢。以下是日语解释。

課題
􀂄 次の要件と次ページ以降の通信規定を満たすTCP/IP通信型クイズ出題クライアントプログラムを作成せよ
􀂋サーバ(作成不要)
􀁺 認証されたユーザに対しクイズを出題,5問正解したら秘密のメッセージを送信する
􀁺 すべての状態において,クライアントからの要求に対して受動的に動作を行う
􀂋クライアント
􀁺 クイズサーバに対応したユーザインタフェースを実現する

通信規定(1/7)
􀂄 状態の規程
􀂋サーバには以下の状態が存在
􀁺 ユーザ名を受け付ける状態(状態1)
􀁺 パスワードを受け付ける状態(状態2)
􀁺 クイズ出題を受け付ける状態(状態3)
􀁺 解答を受け付ける状態(状態4)
􀁺 秘密のメッセージの送信を受け付ける状態(状態5)
􀂄 クライアントでは,サーバがどの状態にあるかを判断して,必要なデータ送信を実施すること

通信規定(2/7)
􀂄 ユーザ名受付状態(状態1)
􀂋 ユーザ名として,自分の学籍番号(CD付)を使用すること
􀂋 例: p010123(アルファベットは小文字)
􀂋 ユーザ名の送信には,「USER <ユーザ名>」の形式を使用すること
􀂋 正しいユーザ名が入力された場合には,文字列“OK”を返し,パスワード受付状態(状態2)に遷移すること
􀂋 誤ったユーザ名が入力された場合には,文字列“NG”を返し,状態を遷移しないこと
􀂋 「USER」以外のコマンドが入力された場合には,文字列“ERROR”を返し,状態を遷移しないこと

通信規定(3/7)
􀂄 パスワード受付状態(状態2)
􀂋 パスワードとして,自分の学籍番号(CD付)を反対から書いた文字列を使用すること
􀂋 例: 321010p
􀂋 パスワードの送信には,「PASS <パスワード>」の形式を使用すること
􀂋 正しいパスワードが入力された場合には,文字列“OK”を返し,クイズ出題受付状態(状態3)に遷移すること
􀂋 誤ったパスワードが入力された場合には,文字列“NG”を返し,ユーザ名受付状態(状態1)に遷移すること
􀂋 「PASS」以外のコマンドが入力された場合には,文字列“ERROR”を返し,状態を遷移しないこと

通信規定(4/7)
􀂄 クイズ出題受付状態(状態3)
􀂋 クイズの正解数はサーバ・クライアント双方で保持しておくこと
􀂋 クイズの出題要求には,「QUIZ <現在の正解数>」の形式を使用すること(すなわち,正解数はクライアントでも保持しておく必要がある)
􀂋 正しい正解数が入力された場合には,クイズを出題(すなわち,クイズの文章を送信)し,解答受付状態(状態4)に遷移すること
􀂋 誤った正解数が入力された場合には,文字列“NG”を返し,状態を遷移しないこと
􀂋 「QUIZ」以外のコマンドが入力された場合には,文字列“ERROR”を返し,状態を遷移しないこと

通信規定(5/7)
􀂄 解答受付状態(状態4)
􀂋 解答の送信には,「ANSR <答え>」の形式を使用すること
􀂋 正しい解答が入力された場合には,文字列“OK”を返し,正解数を1増加させること
􀂋 間違えた解答が入力された場合には,文字列“NG”を返すこと
􀂋 正解数が5になった場合には,秘密メッセージ受付状態(状態5)に遷移すること.それ以外の場合にはクイズ出題受付状態(状態3)に遷移すること
􀂋 「ANSR」以外のコマンドが入力された場合には,文字列“ERROR”を返し,状態を遷移しないこと

通信規定(6/7)
􀂄 秘密メッセージ受付状態(状態5)
􀂋 秘密のメッセージは「GET MESSAGE」にて要求すること
􀂋 正しいコマンドが送られてきた場合には,秘密のメッセージ文章を返し,状態を遷移しないこと.
􀂋 引数部に誤りがある場合(すなわち「MESSAGE」以外の文字列を受信した場合)には,文字列“NG”を返し,状態を遷移しないこと
􀂋 「GET」以外のコマンドが入力された場合には,文字列“ERROR”を返し,状態を遷移しないこと

通信規定(7/7)
􀂄 終了メッセージ
􀂋 サーバは「QUIT」を受信すると“GOOD BYE”を返し,どの状態にいても接続を切断すること
􀂋 クライアントは「GOOD BYE」を受信すると,プログラムを終了する(とよい)
クライアントの条件
􀂄 クライアントでは通信規定に基づき的確なユーザインタフェースを実現すること
􀂋 「ユーザ名を入力して下さい→」の表示
􀂋 サーバからのメッセージを受信したときには,それをそのまま表示するのではなく適当な文章に変換して表示
􀂋 NG → 「パスワードが違います」など
􀂄 必要な状態を記憶しておくこと
􀂋 クイズ正解数は利用者が覚えておくのではなく,クライアントソフトで自動的に記憶可能である
􀂋 クライアントによる支援クイズサーバ簡易版とクライアントを提供します.

圧縮にはzipを利用し,sample_oli_utf8.zipとしてあります.
Linux環境で解凍するには,以下のコマンドを実行します.
unzip sample_oli_utf8.zip
これにより,実行ファイル「quiz_server」と「client」が取り出せます.
インタフェースは組み込まれていません.
(なお,同名ファイルがあれば上書きされる恐れがあります.注意して下さい.)
このままでは実行許可がありませんので,次のコマンドにてパーミッションを変更して下さい.
chmod u+x quiz_server
chmod u+x client

● 実行環境
クイズサーバプログラム「quiz_server」は,Linux環境でコンパイルされた実行型ファイルです.
Linux上でのみ動作します.漢字コードは,UTF-8です.

● 実行方法
ポート番号は起動時に指定するようにしてあります.実行する場合には,
./quiz_server 12345
のように,第1引数にポート番号を指定して下さい.起動後は,第2回課題で指定したプロトコルにしたがって動作します.

クライアントのほうは,
./client 127.0.0.1 12345
のように,第1引数にIPアドレス,第2引数にポート番号を指定して下さい.なお,サーバと同じマシンでクライアントを起動する場合には,IPアドレスを127.0.0.1(ローカルアドレス)とすれば動作します.

● アカウント
ユーザ名とパスワードには,以下の4種類が登録されています.
ユーザ名 パスワード
test1  1tset
test2  2tset
test3  3tset
test4  4tset

● クイズ出題
プログラムを簡略化するため,15問のみ用意してあります.
● 秘密のメッセージ
ユーザ名 メッセージ
test1  secret_message1
test2  secret_message2
test3  secret_message3
test4  secret_message4

提供sample_oli_utf8.zip sample_oli_utf8.zip (12.05 KB, 下载次数: 3) ,里面有可以执行的server ,client , 还有需要改变的client.c

上面说的挺麻烦,其实依我理解,要做的client.c需要做的改变是,
没改之前,需输入USER test1,改后,就变成提问的形式,ユーザ名を入力して下さい→test1
没改之前,需输入PASS 1tset,改后,就变成提问的形式,パスワードは?→1tset
等。。

上面说的有点乱,小妹QQ:75748086。。随时恭候您的疑问和指导。。
由于作业很重要,哪怕是一点点思想也好。
拜托传授。麻烦烦您了。再次致以最崇高的谢意。。。
发表于 2010-4-23 13:13:12 | 显示全部楼层
没有人回应你吗?
作业做完了吗?
没有Linux环境  不过晚上给你看一下  可能不写代码了  只给你讲讲思路。。。   今天心情比较失落
回复

使用道具 举报

发表于 2010-4-25 20:14:13 | 显示全部楼层
本帖最后由 等待UFO 于 2010-5-1 22:29 编辑

#include
#include
#include
#include
#include
#include
#include

//各状態定義  Bgn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define STATUS_WAITTING_USERNAME 0  //ユーザ名入力待ち状態
#define STATUS_WAITTING_PASSWORD 1  //パスワード入力待ち状態
//こんな感じですべての状態を定義する
//>>>>>>>>>>>>>>>>>
//这个部分是原来的程序里给的  注释掉    根服务器通信的部分可以借鉴一下
        //この部分はクライアントからの入力内容をそのままサーバに送信する部分
        //今回は各状態に応じてそれぞれの処理をするように修正する必要がある
  // Input ID
  while( 1 ) {                 
    fgets( buf, 1024, stdin );
    if ( buf[strlen(buf)-1] == 'n' ) buf[strlen(buf)-1] = '';
    write( soc, buf, 1024 );           //サーバへ文字列を送信する部分
    read( soc, buf, 1024 );            //サーバからの返事を受信する部分
    fprintf( stdout, "%sn", buf );
    if ( !strcmp( buf, "GOOD BYE" ) )
      break;
  }
回复

使用道具 举报

发表于 2010-4-25 20:19:32 | 显示全部楼层
1。 先把所有的状态都定义以下   如下
   //各状態定義  Bgn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define STATUS_WAITTING_USERNAME 0  //ユーザ名入力待ち状態
#define STATUS_WAITTING_PASSWORD 1  //パスワード入力待ち状態
#define 什么什么状态。。。

2。然后 每个状态里面要做得处理 按照式样书里的描述那样 一条一条的列出来   然后 就按照列出来的每个条目用程序实现就行了

注  所有的状态里面  首先都要判断用户输入的是不是 QUIT字符串, 如果是的话 就给服务器发送 QUIT字符串告诉服务器程序结束,  然后 客户端的程序也可以结束了
回复

使用道具 举报

发表于 2010-4-25 20:25:40 | 显示全部楼层
大体上的思路就这样了  
这里面需要注意    如果是要unicode编程  还要注意跟ansi编程所使用的函数不太一样。 估计你们还没有做到unicode/ansi区别编程那么深入(给出的例子程序里也没有区别开)  所以 暂时就按照ansi的方式写了
例如   ansi里面用   char类型,  但是unicode的话 需要用 WCHAR类型 等等

如果不是对应unicode的话  日文可能会变成乱码   但是 只是乱码而已  其他的功能都是可以用的  (如果没有乱码 那就算侥幸了)
回复

使用道具 举报

发表于 2010-4-25 20:31:42 | 显示全部楼层
上面的程序是记事本里写的  没有编译过   也许有些函数的用法可能有错  如果编译出错的话  麻烦自己慢慢纠正吧   

这次 重要的是给你传授一下思路   希望你能 “一点通   一通儿百通”。。。
回复

使用道具 举报

头像被屏蔽
发表于 2010-5-11 12:03:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2010-5-12 01:40:20 | 显示全部楼层
你的系统是mac osx,这个系统我没用过,不知道你的c编译环境是什么,如果是gcc,那么在gcc解压目录中搜索,应该有那些.h头文件,其实.h文件在那儿不重要,你在安装gcc时有一步应该是把gcc目录添加到系统路径中,这样无论你的c工程在那儿,都可以直接包含这些.h,而不需要在.h文件前面再加绝对路径了
回复

使用道具 举报

发表于 2010-5-15 11:45:27 | 显示全部楼层
请问UFO
  如何学习C语言,学了 好久也没学好.
1.系统里的那些.h是在哪里,我的系统是mac osx,什么时候用什么.h
2.看别人的代码学编程,有没有有关C这方面的实例吗?
谢谢.
sitinl 发表于 2010-5-11 12:03

〉系统里的那些.h是在哪里
搜索一下   文件名写  .h  就会搜出来了  (windows的时候。  mac也一样吧)
〉什么时候用什么.h
这就是C语言水平问题了  做的多了 自然就会记住一些常用的h了  当让  谁也不会都一一背下来的(那太有病了)  现在网络这么发达  网上都有的 可以搜索一下 例如
这是 C语言头文件大全 的搜索结果
http://www.google.com/search?hl=zh-CN&source=hp&q=c%E8%AF%AD%E8%A8%80%E5%A4%B4%E6%96%87%E4%BB%B6%E5%A4%A7%E5%85%A8&aq=3g&aqi=g-g5g1g-g2&aql=&oq=c%E8%AF%AD%E8%A8%80+%E5%A4%B4%E6%96%87%E4%BB%B6&gs_rfai=

http://zhidao.baidu.com/question/26485753
http://www.docin.com/p-1481487.html
这些都是 C语言头文件以及包含内容的简单描述。

我知道你的问题出在哪里   你不是想知道 “什么时候用什么.h  ” 而是, “什么时候用什么函数” 的问题。  决定用什么函数了, 那么自然就能找到那个函数的.h文件。  所以  你还是多多学习  多多作练习题  慢慢记住一些函数才行

例如
内存初始化    用   memset()
内存分配             malloc()
字符窜函数           strcpy()
                         strcat()
                         strcmp()
。。。   知道了函数  自然就能找到所属.h文件。    你想从那么多的.h文件里找到某一个函数 那可要累死了。
所以  学习C  多做例题   多记“什么时候  用什么函数”。。。

例如
我要想进行内存拷贝     那么  就要用  memcpy()函数,   自然就能找到要包含的头文件是   #include 了 (不知道头文件  就用 memcpy在网上搜)
想要往屏幕上打印文字  那么  就要用  sprintf()函数       自然就要 #include 了   往屏幕上打印文字  属于 输入/输出 操作   即  Input/Output操作, 即  IO操作, 所以  头文件是 stdio.h  这样的记忆方法也不错

〉看别人的代码学编程,有没有有关C这方面的实例吗?
这个一般不买 《XXXX实用教程》等系列书  就很难找了吧    网上有代码也基本上都是给懂得人讲的   很少给学习者的例子那样说明详细的。。。  
在网上没见过这样的例子阿。。。

小刚  你给回答以下呗
回复

使用道具 举报

头像被屏蔽
发表于 2010-5-16 01:56:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小春网
常务客服微信
微信订阅号
手机客户端
扫一扫,查看更方便! 快速回复 返回顶部 返回列表