HiroLab

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

C++

【C++】Day 21:ネットワークプログラミングの基礎

投稿日:

Day 21では、ネットワークプログラミングの基礎について学習します。

ネットワークプログラミングは、コンピュータ間でデータを送受信するプログラミングのことを指します。主にソケットを使用してネットワーク通信を行います。

以下にネットワークプログラミングの主な内容と、例題、演習問題を提示します。

 

ネットワークプログラミングの主な内容:

1. ソケットとは:
– ソケットは、ネットワーク通信を行うためのプログラムインターフェースです。
– クライアントとサーバーの間でデータを送受信する際に使用されます。

 

2. プロトコルとポート番号:
– ネットワーク通信では、通信に使用するプロトコルとポート番号を指定する必要があります。
– TCP(Transmission Control Protocol)やUDP(User Datagram Protocol)などのプロトコルを選択し、ポート番号を指定します。

 

3. サーバーとクライアント:
– ネットワークプログラミングでは、サーバーとクライアントの2つの役割があります。
– サーバーはクライアントからの接続を待ち受け、クライアントはサーバーに接続してデータを送信します。

 

例題:

以下は、簡単なエコーサーバーとクライアントの例です。エコーサーバーは、クライアントから受け取ったメッセージをそのまま返すシンプルなサーバーです。

エコーサーバーの例:

#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) {
write(clientSocket, buffer, bytesRead);
}

close(clientSocket);
close(serverSocket);

return 0;
}

 

エコークライアントの例:

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

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

sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);

if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {
std::cerr << "Error connecting to server." << std::endl;
close(clientSocket);
return 1;
}

const char* message = "Hello, server!";
write(clientSocket, message, strlen(message));

char buffer[1024];
int bytesRead = read(clientSocket, buffer, sizeof(buffer));
std::cout << "Server response: " << std::string(buffer, bytesRead) << std::endl;

close(clientSocket);

return 0;
}

 

演習問題:

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

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

これらの例題と演習問題を解くことで、ネットワークプログラミングの基礎を理解し、クライアントとサーバーの通信を実現するスキルを向上させることができます。問題を解いたら、クライアントとサーバーが正しく通信しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

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

関連記事

【C++】Day 24:デバッグとテスト

Day 24では、デバッグとテストについて学習します。 プログラムを書く際には、バグを見つけて修正するデバッグや、プログラムが正しく動作することを確認するテストが重要です。 以下にデバッグとテストに関 …

【C++】Day1-30 総復習/演習問題

以下に、Day 1-30までのC++学習カリキュラムにおける総復習と演習問題を提示します。 演習問題に対する回答と解説も記載しますので、各問題に取り組んで理解を深めてください。 ※後半に回答/解説を記 …

【C++】Day 27:デザインパターン「構造型パターン」

Day 27では、デザインパターンのうち「構造型パターン」について学習します。 構造型パターンは、クラスやオブジェクトの構造を改良するためのパターンです。主な構造型パターンには、アダプタ、デコレータ、 …

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

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

【C++】Day 29:「セキュリティと暗号化」

Day 29では、「セキュリティと暗号化」について学習します。 セキュリティと暗号化は、情報を保護するための重要な概念です。データの機密性、完全性、可用性を確保するために、データの暗号化、ハッシュ化、 …