Sock-05.チャットっぽいなにかを作って流れを確認
今回のお題
フローチャートを確認しつつ簡易的なチャットっぽいなにかを作ってみよう
今回のプログラムは
コンソールアプリケーション ※DxLibは使わない!
UDP
交互に文字列を送受信
サーバ
1. ヘッダ・ライブラリ
必要なヘッダインクルードしたり、ライブラリを追加したりする
code:Server02.cpp
2. WinSockの初期化と終了処理
初期化はしたけど、終了処理は忘れた!…ってならないように、初期化と終了まとめて書いておこう
code:Server02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// WinSockの終了処理
}
3. UDPソケットの作成とソケットの破棄
アドレスファミリ:AF_INET
ソケットタイプ:SOCK_DGRAM
プロトコル:IPPROTO_UDP
0でもok
エラーが出たら、エラーコードを出力しつつ終了させてしまおう
エラーコード:WSAGetLastError()で直近のエラーコードが取得可能
code:Server02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// UDPソケットの破棄
// WinSockの終了処理
}
4. 3で作ったソケットに固定ポート番号を割り当てる
SOCKADDR_IN構造体の変数を用意
メンバ変数に必要な値をセット
bindで固定のポート番号を割り当てる
code:Server02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// ポート番号割り当て
// UDPソケットの破棄
// WinSockの終了処理
}
通信する2つのプログラムでどちらも固定のポート番号割り当てても別にだめじゃない
C/S型だとサーバは固定、クライアントはエフェメラルポートってイメージだけど、どっちも固定にすればP2Pちっくになる
5. クライアントからなんかとどくのまつ ※受信文字列のサイズがわからん!!
サーバはクライアントのアドレス知らないから、待つしかない
code:Server02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// ポート番号割り当て
// 受信...受信があるまでブロッキング発生!
// 受信した文字列の出力
cout << 受信した文字列 << endl;
// UDPソケットの破棄
// WinSockの終了処理
}
6. 文字列入力してクライアントに送信
5の受信時にクライアントのアドレスも取得できる
それを使って返信する形式
code:Server02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// ポート番号割り当て
// 受信...受信があるまでブロッキング発生!
// 受信した文字列の出力
cout << 受信した文字列 << endl;
// 文字列入力
cin >> ???;
// 文字列の送信
// UDPソケットの破棄
// WinSockの終了処理
}
クライアント
1. ヘッダ・ライブラリ~ 3.UDPソケットの作成とソケットの破棄
サーバと一緒
code:Cliemt02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// UDPソケットの破棄
// WinSockの終了処理
}
2. 宛先( サーバ )のアドレスをセット!
SOCKADDR_IN構造体の変数を用意
メンバ変数に必要な値をセット
code:Client02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// 宛先のアドレスセット!
// UDPソケットの破棄
// WinSockの終了処理
}
3. 文字列入力して送信!
code:Client02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// 宛先のアドレスセット!
// 文字列入力
cout << ???;
// 文字列の送信
// UDPソケットの破棄
// WinSockの終了処理
}
4. サーバからなんかとどくの待つ
受信
code:Client02.cpp
int main()
{
// WinSockの初期化処理 WinSock2.2
// UDPソケットの作成
// 宛先のアドレスセット!
// 文字列入力
cout << ???;
// 文字列の送信
// 受信...受信があるまでブロッキング発生!
// 受信した文字列の出力
cout << 受信した文字列 << endl;
// UDPソケットの破棄
// WinSockの終了処理
}
おしまい
あとはサーバもクライアントも送受信部分をループにするだけでそれっぽい動きになるでしょう
さよならのメッセージを決めておいてループから抜けるようにすること
byeって入力したらbreak、byeって文字列受信したらbreak