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
. リモートプログラム実行機能を追加したプログラムを作成してください。クライアントがサーバー上で指定されたプログラムを実行し、その結果をクライアントが受け取れるようにしてください。
これらの例題と演習問題を解くことで、ネットワークプログラミングの応用におけるファイル転送、チャットアプリケーション、リモートプログラム実行などのスキルを向上させることができます。問題を解いたら、各応用が正しく動作しているかどうかを確認してみてください。