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. 複数のクライアントが同時に接続できるマルチスレッド対応のエコーサーバーを作成してください。各クライアントのメッセージを個別のスレッドで処理し、サーバーが複数のクライアントに対応できるようにしてください。
これらの例題と演習問題を解くことで、ネットワークプログラミングの基礎を理解し、クライアントとサーバーの通信を実現するスキルを向上させることができます。問題を解いたら、クライアントとサーバーが正しく通信しているかどうかを確認してみてください。