ネットワーク

DMS


【DM Simulator ソースコード】

オンラインカード対戦ゲームなどを作ろうと考えていらっしゃる方の参考になると思います。
しかし、通信処理の部分がかなり甘いので、今から作る方は【0限目】Windows Socket API と サーバーサイドなんかを参考に作るといいと思います。Winアプリについても【4限目】非同期通知で触れているのでご安心下さい。

このエントリーをはてなブックマークに追加

【0限目】TCP/IP通信とは
[難易度:★☆☆☆☆] TCP/IP通信の基礎となる知識を習得します。


【1限目】Bit と Byte
[難易度:★★☆☆☆] コンピュータの最小単位、ビットとバイトについて学習します。


【2限目】ネットワークバイトオーダー
[難易度:★☆☆☆☆] ネットワーク上に流れるデータの規則について学習します。


【3限目】IPアドレス
[難易度:★★☆☆☆] IPアドレスについて学習します。(其の壱)


【4限目】グローバルIP と ローカルIP
[難易度:★★☆☆☆] IPアドレスについて学習します。(其の弐)


【5限目】fire wall と port
[難易度:★☆☆☆☆] ファイアウォールについて学習します。


【6限目】TCPの基礎理論 / 3 Way handshaking
[難易度:★☆☆☆☆] TCP通信はなぜ信頼性が高いのかについて学習します。

このエントリーをはてなブックマークに追加

もしあなたがオンラインゲームを作成する場合は注意が必要です。
1フレーム毎に1パケットを送ることはかなり難しいからです。

理由は単純で、1パケットを処理するのに掛かる時間は1フレームより長いからです。
なのでパケットは20フレームから30フレームに一度だけ送信するべきです。

え? それだと格闘ゲームが作れない?

そんな時は……仕方がないので1フレーム毎にパケットを送ります。その代わり、1パケットに5フレーム分位情報を持たせて下さいつまり1パケットに現在の挙動の前後の情報も持たせておくのです。
こうしておけば、パケットロスしても以前のパケットから相手の入力を読み取ることができます。

それか3フレーム単位で動く格闘ゲームを作って下さい。
このエントリーをはてなブックマークに追加

TCPは信頼性があり、UDPは信頼性がないと以前お話したことを覚えていますか?

なぜTCPは信頼性があるのでしょうか、その秘密はTCPの仕組みにあります。

TCPは相手へパケットを転送する前に、SYNパケットを自動的に送信します。
そのSYNパケットに対し、相手はSYN ACKパケットを返却します。SYN ACKパケットを受け取った時、今度はACKパケットを送信して、初めてパケットを転送するのです。

つまり、相手との接続が確実にうまくいくか、事前に確認しているのです。
ちなみにTCPは転送したパケットの順番もきちんと守ります。

これらの処理はTCPが行うものであり、プログラマが意識する必要はありません。
プログラマは、TCPを使う場合もUDPを使う場合もほとんど同じ書式のコードを記述します。
よって、確実に届いて欲しい時にはTCPを、多少パケットをロスしてもいいから速く届いて欲しい時にはUDPを用いればよいのです。どちらを使うにしても、コーディングの難易度は変わりません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
お疲れ様でした。これにてネットワーク概論の講義は終了です。
これで通信プログラムを書くための知識は一通り身に付きました。
座学はこの辺にして、実際にプログラムを書きまくって下さい。
通信系のプログラムは、初めて書いた時は9割方動かないので覚悟して下さい。
このエントリーをはてなブックマークに追加

ファイアウォールとは、PCへ流入してくるパケットが安全かどうかを確かめ、安全であれば受け入れ、そうでなければ破棄するシステムのことです。
パケット:転送されてくるデータのこと
ファイアウォールはPC毎に設定することもありますし、ルーターへその役割を担わせることもあります。個人で利用するPCであれば、PC毎に設定することが多いです。
6


通信を行うソフトウェアを作成する際には、そのソフトウェアがファイアウォールにブロックされないよう設定を行う必要があります。また、サーバーを構築する際には、予めファイアウォールに穴を空けておき、自分達のパケットはその穴を通すようにする必要があります。不要な穴を空けてはいけません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
前回、IPアドレスで相手方のコンピュータを識別することが可能とお話しました。
しかし、IPアドレスだけでは足りないのです。
IPアドレスで確かに相手方のコンピュータは分かるのですが、相手のコンピュータで稼働しているどのアプリケーションへ届ければよいかまでは分かりません。
例えば相手がオンラインゲームを起動しながらスカイプを使っていたらどうでしょう?
果たしてこのパケットはオンラインゲームのデータなのでしょうか? スカイプの音声なのでしょうか? それを判別する為に「ポート番号」を用います。

ポート番号とは、アプリケーション毎に設定されたデータサーキットの出入口です。
つまり、ポート番号1番をオンラインゲームが専有し、ポート番号2番をスカイプが専有するのです。
パケットが届いた暁には、パケットのヘッダー(内部情報)を参照し、ポート番号が1番なのか2番なのか確認します。1番であればオンラインゲームへ届け、2番であればスカイプへ届けるのです。
8

このように、IPアドレスでPCへ転送した後、ポート番号を使ってアプリケーションへ転送するのです。ここまでやって初めてデータが届けられるのです。

ちなみにポート番号の何番をアプリケーションで専有するかは、予めプログラミングしておきます。送出するパケットにはその情報を持たせ、受け取るアプリケーションではポート番号X番を専有する処理を書いておきます。

個人で制作するアプリケーションの場合、49152番~65535番を勝手に使用することができます。
どこかに届け出る必要はありません。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
また、ファイアウォールにて空けておく穴も同じくポート番号です。
ファイアウォールへ予め「ポート番号55555番は使用するからパケットを捨てないで下さい」と命令しておきます。
7
このエントリーをはてなブックマークに追加

↑このページのトップヘ