してることが少ないので、オーバーヘッドも少なめです。最後の違いは、データが送信される方式です。ストリームプロトコルが使われてます。メッセージとメッセージの間に境界線がありません。なんてこともあるかもしれません。データグラムプロトコルが使われてます。データグラムというのは、データ同士が、お互いに混ざり合わないようになっているパケットです。何かデータを受信したとすると、そのデータは、送信されたときと同じ状態であることが保証されてます。あ、もう1つ違いがあった。接続せずに通信するので、複数の受信相手にブロードキャストすることができます。ネットワーク全体にブロードキャスト、なんてことも可能です。いうことはできません。えー、TCPの接続というかコネクションには2つの接続口があります。他のマシンからの接続を待ち構えている側(つまりサーバーですね)。それと、自分からどこかに接続をする側(つまりクライアントですね)。クライアント側では、話はカンタンです。sf::TcpSocketクラスのインスタンスを作って、connect関数で接続します。error...}最初の引数は接続相手のアドレスです。このクラスを使うと、URLでもIPアドレスでもホスト名でも、なんでも使えます。APIドキュメントを見てね。2番目の引数は、接続先のポート番号です。相手マシンがこのポート番号で接続を待ち受けていないと、接続は成功しません。1つ、オプションとして3番目の引数もあります。タイムアウトの設定です。タイムアウトが設定されている場合、設定されている時間が経過する前に接続が失敗すると、エラーが返ってきます。デフォルト値が使われます。getRemotePort()関数で、相手マシンのアドレスやポート番号を取得することもできます(必要なら)。デフォルトでは、ソケットクラスの関数はどれもブロッキングモードで実行されるようになっています。停止した状態になる、ということです。通信の処理は場合によっては時間がかかるので、その間プログラムは停止している必要があるのです。データを受信するときには、受信が完了してデータが使えるようになるまで待ってないといけない、などなど。setBlocking関数を使うと、この設定を変更して、処理をノンブロッキングモードで実行できるようになります。詳しくはこのページの最後のパートを読んでくださいませ。サーバー側では、クライアント側よりも設定がたくさんあります。クライアントからの接続を待ち受けて、接続したクライアントごとに複数のソケットが必要です。sf::TcpListenreクラスを使います。接続を待ち受けるための専用のクラスです。データの送受信はしません。使って次の接続を再び待ち受けることができます。accept関数を呼び出すと、次に誰かが接続してくるまで処理がそこでストップします(ブロッキングモードに設定されている場合)。接続が来ると、ソケットが初期化されて処理が戻ってきます。このとき、このソケットは接続してきたクライアントと通信できる状態になってます。リスナーは再び次の接続を待ち受けることができます。コネクションが確立されて、両ソケットはお互いにデータをやりとりできるようになります。データを受信するには、ポート番号を指定してバインドする必要があります。コネクションを作る必要がないとは言っても、全部のポートにやってきたデータを受信することはできないのですね。error...}ソケットをポートにバインドしたら、データを受信する準備完了です。自動的に取得できます。UDPでデータを受信するやり方でした。送信のやり方はと言うと、UDPソケットでデータを送信するために、特に前準備は必要ありません。データを送って受信する送受信の仕方は、どっちのタイプのソケットでも同じです。引数を2つ多く持ってることです。送信者/受信者のアドレスとポート番号です。送信と受信のそれぞれに、2種類のやり方があります。1つ目は、データを生のバイト列のままで送受信する「ローレベルな」方法。1つは、生のデータではなく、sf::Packetクラスでデータを送受信するやり方です。パケットクラスのチュートリアルを見てね。ここでは「ローレベルな」やり方についてだけ説明するよ。send関数を使います。引数に、送信したいデータ(バイト列)へのポインタと、何バイト送りたいのかのバイト数を指定してね。どんな型のアドレスでも入れれます。バイト列以外のデータを入れるのは多分バッドアイディアだよ。サイズが1バイトより大きなネイティブ型は、マシンによってサイズが同じとは限らないんだ。サイズが違っていて、エンディアンも違ってたりします。同士では正確に送受信できないかもしれない。この件について詳しくは(解決策も)、パケットクラスのチュートリアルでお話するね。UDPソケットを使うとネットワーク全体に同時にブロードキャストできます。いう特別なアドレスを使うよ。UPDを使うときには、もう1つ覚えておい欲しいことがあります。データはデータグラムで送信されるんだったよね。データグラムにはサイズの制限がある。そのサイズを超えるデータを1度に送ることはできないのです。このバイト数を超えてはダメです。バイトより少し少ないぐらいです。receive関数を使います。std::endl;大事なことを1つ。ソケットがブロッキングモードのとき、receive関数は何かを受信するまで待機します。その間、この関数を呼んだスレッド(たぶんプログラム全体)が固まります。最初の引数は、バッファです。受信したデータがここにコピーされます。2番目の引数が、そのデータの最大サイズです。実際に何バイトのデータを受信したのかが、3番目の引数に指定した変数に格納されます。UDPソケットを使う場合のもので、送信者のアドレスとポートが入ってきます。ここに入ってくる値を使って、レスポンスを返信することができるというわけです(必要なら)。何か特別な事情がない限り、使わない方がいいです。パケットを使うよりも強力で柔軟なプログラミングテクニックがない限り......。ブロッキングモードで複数のソケットを同時に使う通信相手が1人とは限らないわけで、1つのソケットでいちいちブロックがかかったてたら鬱陶しいですよね。ソケット1がデータを受信して処理しようとしたところでソケット2がプログラムをブロックする、とか。複数のソケットで同時に待ち受け処理をしたい。待ち受けているソケットのうち、どれか1つでもデータを受信するとブロックが解除される、みたいな。ソケットセレクター(sf::SocketSelectorクラス)を使うと、その夢が叶います。ソケットセレクターは、どの種類のソケットも監視できます。add関数を使って、セレクターにソケットを登録します。中に入れたソケットを取り出そうとしたり、いくつ入れたのかを直接カウントしようとはしないでね。?)監視したいソケットを全部セレクターに入れたら、wait関数を実行だ。中に入れたソケットのうち、どれか1がデータを受信する(か、エラーを出す)まで待機するよ。タイムアウトを設定することもできます。設定した時間が経過しても何も受信しなかったら、関数が終了するよ。この設定をしておくと、何も起きなくて永遠に固まったまま、という事態を回避できるというわけです。監視しているソケットのうちのどれか1つ(か1つ以上)のソケットがデータを受信した、ということです。receive関数を実行しても、プログラムが固まる心配はありません。場合は、「データを受信した」じゃなく「接続が来た」という意味になりますね。accept関数ですね。して、どのソケットがデータを受信したのでしょう?セレクターはソケットのリストじゃないので、直接はわからないのです。isReady関数を使って、容疑者を片っ端から調べます。ループは好きなように書いてくださいませ。複数のクライアントのコネクションやメッセージを扱うサンプルがあるので、見てみてくださいませ。タイムアウトつきの受信処理をカンタンに実装できます。ソケットクラス単独だとできません。setBlocking関数でいつでも設定を変更できます。udpSocket;udpSocket.setBlocking(false);ノンブロッキングに設定すると、関数はすぐに結果を返してくるようになります。