HiroLab

プログラミングに関する情報発信サイト。

C++

【C++】Day 22:ネットワークプログラミングにおけるソケットとプロトコル

投稿日:

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。

ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を定義するものです。ネットワークプログラミングでは、適切なソケットとプロトコルを選択して通信を行います。

以下に詳細な内容と、例題、演習問題を提示します。

 

ネットワークプログラミングのソケットとプロトコルについての主な内容:

1. ソケットとは:
– ソケットは、ネットワーク通信を行うためのAPI(Application Programming Interface)です。
– ソケットを使用して、クライアントとサーバー間でデータを送受信します。

 

2. ソケットの種類:
– ソケットには主に2種類あります。
– TCPソケット: 可能な限り信頼性のあるデータ転送を提供するソケット。TCPプロトコルに基づいています。
– UDPソケット: 高速なデータ転送を提供するが、信頼性は低いソケット。UDPプロトコルに基づいています。

 

3. プロトコルとは:
– ネットワーク通信において、クライアントとサーバーが通信方法を理解するために必要なルールや規約のことを指します。
– 代表的なプロトコルとしてTCP(Transmission Control Protocol)とUDP(User Datagram Protocol)があります。

 

例題:

以下は、TCPソケットを使用してクライアントからサーバーにメッセージを送信し、サーバーがそのメッセージを大文字に変換してクライアントに返すエコーサーバーの例です。

エコーサーバーの例:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket == -1) {
std::cerr << "Error creating socket." << std::endl;
return 1;
}

sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8080);

if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
std::cerr << "Error binding socket." << std::endl;
close(serverSocket);
return 1;
}

if (listen(serverSocket, 5) == -1) {
std::cerr << "Error listening." << std::endl;
close(serverSocket);
return 1;
}

std::cout << "Server started. Listening on port 8080..." << std::endl;

sockaddr_in clientAddr;
socklen_t clientAddrSize = sizeof(clientAddr);
int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, &clientAddrSize);

char buffer[1024];
int bytesRead;
while ((bytesRead = read(clientSocket, buffer, sizeof(buffer))) > 0) {
for (int i = 0; i < bytesRead; ++i) {
buffer[i] = toupper(buffer[i]);
}
write(clientSocket, buffer, bytesRead);
}

close(clientSocket);
close(serverSocket);

return 0;
}

演習問題:

1. UDPソケットを使用してクライアントからサーバーにメッセージを送信し、サーバーがそのメッセージを大文字に変換してクライアントに返すエコーサーバーを作成してください。

2. マルチスレッド対応のTCPエコーサーバーを作成してください。複数のクライアントが同時に接続できるようにしてください。各クライアントのメッセージを個別のスレッドで処理し、サーバーが複数のクライアントに対応できるようにしてください。

これらの例題と演習問題を解くことで、ソケットとプロトコルの基礎を理解し、クライアントとサーバー間の通信を実現するスキルを向上させることができます。問題を解いたら、TCPとUDPの違いやマルチスレッド対応が正しく機能しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【C++】Day 13:メモリ管理とスマートポインタ

Day 13では、メモリ管理とスマートポインタについて学習します。 C++では、メモリの確保と解放を適切に行うことが重要です。スマートポインタは、メモリの自動管理を行う便利な機能です。 以下にそれぞれ …

【C++】Day 23:ネットワークプログラミングの応用

Day 23では、ネットワークプログラミングの応用について学習します。 ネットワークプログラミングは、クライアントとサーバーの間でデータを送受信するだけでなく、さまざまな応用があります。 以下にネット …

【C++】Day 17:例外安全性とエラーハンドリング

Day 17では、例外安全性とエラーハンドリングについて学習します。 C++では、プログラムが例外(予期しないエラー状態)に遭遇した際に、そのエラーを適切に処理することが重要です。例外安全性は、プログ …

【C++】Day 30:C++の応用と展望

Day 30では、「C++の応用と展望」について学習します。 C++は非常にパワフルで柔軟なプログラミング言語であり、さまざまな応用分野で使用されています。この日は、C++の応用領域や将来の展望につい …

【C++】Day 12:C++の標準ライブラリの使用

Day 12では、C++の標準ライブラリの使用について学習します。 C++の標準ライブラリは、様々な便利な関数やコンテナ、アルゴリズムなどを提供しており、プログラムの記述を簡単にしたり、高度な機能を利 …