読者です 読者をやめる 読者になる 読者になる

Lyの日常

主が楽しくプログラムをカキカキするブログ

Win/Mac チャットできるコンソールアプリケーション作った!

C/C++

ドウモ ド=クシャ さん

オンラインゲームが作りたくて
通信の一歩としてチャットアプリを作成したので
記事を書いていきます、ω、

参考にしたサイトはこちら

TCPプログラミング
こちらのサイトは一つ一つの関数について深く述べています
すこしデータが古いのが難点

Geekなぺーじ:プログラミング
とりあえず動くサンプルコードがあります
Win/Mac対応

いつものごとくGithubにあげてます

github.com
開発環境
Win:C++ vs2013
Mac:C++ xcode7.1

通信プロトコル

TCP (Transmission Control Protocol)
現在使われているインターネットの通信の90%は
TCPによるものだと言われているらしい

TCPはコンピューター間に仮想回線をつくり、通信を行うプロトコル
通信失敗時には再送し、受信順番と送信順番を保証します

UDP(User Datagram Protocol)
信頼性のない通信プロトコル
その分通信コストが低くリアルタイム性のある通信が可能

TCP/UDPのどちらも言語やプラットフォームに左右されないのが強みです

今回はチャットアプリを作成しようと思うので
TCPを採用しました

ソケット(Socket)

PC間で通信する際にデータの受け渡しをする者が必要になります
それをソケットと言い、TCP通信のことをソケット通信と呼ぶことがあるようです

Server側は窓口(Socket)で
Client側は訪問者(Socket)みたいなイメージですね

通信の流れ

Server側

# コードはMac時のものです
[1] ソケット作成

int sock;
sockaddr_in addr;

// ソケット作成
sock = socket(AF_INET, SOCK_STREAM, 0);

// ソケットの設定(Server自身の)
addr.sin_family = AF_INET;
addr.sin_port = htons(37951); // *1
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_len = sizeof(addr);

// 設定した内容をソケットに結びつける
bind(sock, (sockaddr *)&addr, sizeof(addr));

// クライアントからの接続を待てる状態にする
listen(sock, 5); // *2

[2] 通信先と接続

sockaddr_in client;
int client_sock;
auto len = sizeof(client);

// 通信を許可
client_sock = accept(sock, (sockaddr *)&client, &len);

[3] データ送受信

// 文字列を送る
write(client_sock, "Wellcom!", 8); // *3

[4] ソケット封鎖

close(client_sock);
close(sock);

// *1 ポート番号は0~65535までと決められている
// *2 引数の5は最大接続人数、大きい数字にしてもOSにより制限されてしまうらしい
// *3 引数の8は文字数

Client側

[1] ソケット作成

int sock;
sockaddr_in server;

// ソケット作成
sock = socket(AF_INET, SOCK_STREAM, 0);

// 接続先を指定
server.sin_family = AF_INET;
server.sin_port = htons(12345);
server.sin_addr.s_addr = inet_addr("127.0.0.1"); // *1

[2] 通信先と接続

// サーバーに接続
connect(sock, (sockaddr *)&server, sizeof(server));

[3] データ送受信

char [32];
read(sock, buf, sizeof(buf));

[4] ソケット封鎖

close(sock);

// *1 アドレス127.0.0.1は自分自身を示しています

アドレスを適切なものに変更すれば他のPCと通信ができます、ω、

最後に

今回通信には特殊なライブラリなどは使用していません
一般的な開発環境(あいまい、ω、)ならすぐ始めれると思います

今回目標にしたのが
チャットアプリを作成している他の人のコードを読まずに完成させること
でした。
ググれば見つかるでしょうがせっかく初めての通信プログラムだったので
頑張ってみました、ω、