HiroLab

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

C++

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

投稿日:

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

ネットワークプログラミングは、クライアントとサーバーの間でデータを送受信するだけでなく、さまざまな応用があります。

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

 

ネットワークプログラミングの応用:

1. ファイル転送:
– クライアントからサーバーにファイルをアップロードしたり、サーバーからクライアントにファイルをダウンロードしたりする応用があります。
– ファイルのバイナリデータを送受信するためのプロトコルや手法を実装します。

 

2. チャットアプリケーション:
– クライアント間でリアルタイムにテキストメッセージを送受信するチャットアプリケーションは、ネットワークプログラミングの応用例の一つです。
– サーバーを介して複数のクライアント間でメッセージを中継する仕組みを構築します。

 

3. リモートプログラム実行:
– クライアントがサーバー上でプログラムを実行し、結果を受け取る応用もあります。
– セキュリティを考慮してリモートプログラムの実行を制御することが重要です。

 

例題:

以下は、クライアントがサーバーにファイルを送信し、サーバーがそのファイルを受け取って保存するファイル転送プログラムの例です。

ファイル転送サーバーの例:

#include <iostream>
#include <fstream>
#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;
std::ofstream outputFile("received_file.txt", std::ios::binary);
while ((bytesRead = read(clientSocket, buffer, sizeof(buffer))) > 0) {
outputFile.write(buffer, bytesRead);
}

outputFile.close();
close(clientSocket);
close(serverSocket);

std::cout << "File received and saved as 'received_file.txt'." << std::endl;

return 0;
}

 

ファイル転送クライアントの例:

#include <iostream>
#include <fstream>
#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;
}

std::ifstream inputFile("file_to_send.txt", std::ios::binary);
char buffer[1024];
while (!inputFile.eof()) {
inputFile.read(buffer, sizeof(buffer));
int bytesRead = inputFile.gcount();
write(clientSocket, buffer, bytesRead);
}

inputFile.close();
close(clientSocket);

std::cout << "File sent to server." << std::endl;

return 0;
}

 

演習問題:

1. チャットアプリケーションを作成してください。複数のクライアントがサーバーに接続し、リアルタイムにメッセージを送受信できるようにしてください。

2

. リモートプログラム実行機能を追加したプログラムを作成してください。クライアントがサーバー上で指定されたプログラムを実行し、その結果をクライアントが受け取れるようにしてください。

これらの例題と演習問題を解くことで、ネットワークプログラミングの応用におけるファイル転送、チャットアプリケーション、リモートプログラム実行などのスキルを向上させることができます。問題を解いたら、各応用が正しく動作しているかどうかを確認してみてください。

-C++
-, ,

執筆者:


comment

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

関連記事

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

Day 22では、ネットワークプログラミングにおけるソケットとプロトコルについて学習します。 ソケットは、ネットワーク通信を行うためのプログラムインターフェースであり、プロトコルは通信のルールや方法を …

【C++】Day 8:オブジェクト指向プログラミング(OOP)の基礎

Day 8では、オブジェクト指向プログラミング(OOP)の基礎について学習します。 以下にそれぞれの内容を詳細に説明し、例題と演習問題を提示します。   オブジェクト指向プログラミングの基礎 …

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

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

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

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

【C++】Day 16:C++のラムダ式とSTLアルゴリズム

Day 16では、C++のラムダ式とSTLアルゴリズムについて学習します。 ラムダ式は、簡単な関数をインラインで定義する方法であり、STLアルゴリズムは標準ライブラリのアルゴリズム関数です。 以下にそ …