2017 ソフトウェア設計及び演習用の班Wiki

17::g10::ヘッダファイル

user.h

概要

ユーザーのデータをひとまとめにし、扱いやすくするためのヘッダ。
特に文字列を扱うときに、ミスが起きやすいと思うのでそのへんが楽にできたらいいなと思った。

構造体

typedef struct _CharacterData{
int x;
int y;
int state;
} CharacterData;

typedef struct _UserData{
int room;
char name[NAME_SIZE];
char msg[BUFFER];
CharacterData chara;
} UserData;

関数

  • ユーザーデータを初期化する関数
    • void user_data_new(UserData *);
  • ユーザーデータにそれぞれ値をセットする関数
    • void user_set_room(UserData *, int);
    • void user_set_name(UserData *, char *);
    • void user_set_msg(UserData *,char *);
    • void user_set_chara(UserData *,CharacterData);
  • ユーザーデータと文字列の変換
    • void user_convert_str(UserData *, char *);
    • void user_convert_user(UserData *,char *);

connect.h

概要

クライアントからサーバーへ接続する際に必要となる関数や、UserDataを送受信するための関数。

関数

int connect_setup(char *addr, int portnumber);

addrは接続先のIPアドレス("xxx.xxx.xxx.xxx" または"localhost")、potnumberはポート番号。指定するポート番号があんまり若い番号だと、用途が決まっているポートの可能性もあるからおすすめはしない。制限するとしたら、もっと上位のところで制限するべきだろうと考え、制限はしていない。戻り値は割り当てられたソケット。0未満のときは何かしらのエラーが起きてるため、よい感じにエラー処理を。

int connect_send_to_server(UserData *data, int sock);

sockにdataを送信する関数。sockはconnect_setupによって準備されたソケットを(殆どの場合は)用いる。データはよくよく考えれば書き換えるわけじゃないからポインタで貰わなくても良い気がする。まあでもインターフェース書き換えたらいろいろと面倒だからやめておこう。 戻り値は0か-1。0は成功、-1は失敗だからよい感じにエラー処理を。

int connect_recv(UserData *buf, int sock);

sockにデータが届いていればbufにデータをセットして0を返す。届いていなければ特に何もせずに0を返す。エラーが起きればもちろん-1を返すから、よい感じにエラー処理を。

int connect_check_userdata(UserData data);

dataが送信できるようなデータなのかチェックする関数。セミコロンをユーザーデータの文字列変換の制御文字として使用しているためにこの関数が生まれた。そのあとにサーバーの制御用メッセージも生まれたからそのチェックもある。こっちは送れないデータというわけではないことに注意されたし。戻り値-3は制御用メッセージが含まれている。-2は送信不可能なメッセージ。-1は送信不可能な名前を使用している。0ならば特に(プログラム的に)問題のないメッセージ。下品な言葉はチェックしてないから、使用者のモラルが求められる。制御用メッセージは送ってもいいんだから-3じゃなくて1とかで良かったのでは?


最終更新日:2017/08/03 11:36:15