クライアントサーバーモデルを用いたC/C++による文字列反転の実装方法
本記事では、クライアントとサーバーで構成されるシステムを作成する方法を解説します。クライアントが文字列をサーバーへ送信すると、サーバーがその文字列を反転(リバース)し、結果をクライアントに返却するという仕組みです。
ソケットプログラミングの基本
このシステムではソケットプログラミングの概念を利用します。クライアントとサーバー間の接続を確立するためには、ポートを作成する必要があります。ポート番号はソケットが使用できる任意の数値であり、接続を確立するにはクライアントとサーバーの両方で同じポート番号を使用しなければなりません。今回は例としてポート番号 4000 を使用します。
コンパイルと実行の手順
プログラムを開始する際は、必ず先にサーバープログラムを起動してください。
gcc Server.c -o server
続いて、クライアントプログラムを起動します。
gcc Client.c -o client
サーバーが起動すると、クライアントからの文字列送信を待ち受け状態になります。クライアント側で文字列を入力すると、そのデータがサーバーへ転送されます。サーバーは受信した文字列を表示するとともに、反転した文字列をクライアントへ送り返します。最後に、クライアントがサーバーから受信した反転済みの文字列を出力します。
クライアント側のコード
//Client Side Code
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 4000
main() {
struct sockaddr_in address;
int my_socket = 0, valread;
struct sockaddr_in server_address;
char str[100];
int l;
printf("Enter a String:");
fgets(str, 100, stdin); // 改行が入力されるまで文字列を読み込む
char buffer[1024] = { 0 }; // 0で初期化したバッファを作成
// ソケットファイルディスクリプタの作成
if ((my_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\nUnable to create Socket \n");
return -1;
}
memset(&server_address, '0', sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
printf("\nThe address is not supported \n");
return -1;
}
// サーバーへの接続
if (connect(my_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
printf("\nUnable to connect to the server \n");
return -1;
}
l = strlen(str);
send(my_socket, str, sizeof(str), 0); // サーバーへメッセージを送信
valread = read(my_socket, str, l); // サーバーからのメッセージを受信
printf("%s\n", str);
}サーバー側のコード
//Server Side Code
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#define PORT 4000
char *strrev(char *str){
char *p1, *p2;
if (! str || ! *str)
return str;
for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2){
*p1 ^= *p2;
*p2 ^= *p1;
*p1 ^= *p2;
}
return str;
}
main() {
int server_fd, new_socket, valread;
struct sockaddr_in address;
char str[100];
int addrlen = sizeof(address);
char buffer[1024] = { 0 };
int i, j, temp;
int l;
char* message = "Welcome to the server"; // 初期メッセージ
// ソケットファイルディスクリプタの作成
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket connection failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) { // ポート4000にバインド
perror("Unable to bind with the socket 4000");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("Listening.....");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr*)&address,(socklen_t*)&addrlen)) < 0) {
perror("Accept");
exit(EXIT_FAILURE);
}
// クライアントから送信された文字列を読み込む
valread = read(new_socket, str, sizeof(str));
l = strlen(str);
printf("\nString sent by client:%s\n", str);
strrev(str); // 文字列を反転
send(new_socket, str, sizeof(str), 0); // 反転した文字列を返送
printf("\nReversed String is sent\n");
}コードのポイント解説
- socket():通信に使用するソケットを作成します。AF_INET(IPv4)とSOCK_STREAM(TCP)を指定しています。
- bind() / listen() / accept():サーバー側でポートに紐付け、接続要求を待ち受け、実際の接続を受け入れます。
- connect():クライアント側からサーバー(127.0.0.1=ローカルホスト)へ接続を確立します。
- send() / read():双方向のデータ送受信を行います。
- strrev():XORスワップという一時変数を使わない手法で文字列を反転しています。
実行結果
クライアントで文字列を入力すると、サーバーのコンソールに受信した文字列が表示され、続いてクライアントの画面に反転された文字列が出力されます。これにより、ネットワーク経由でのデータ送受信と文字列処理が正しく動作していることを確認できます。
-
C++で再帰を使って文字列(文)を反転表示する方法
文字列とは、NULL文字(\0)で終端される1次元の文字配列のことです。文字列の反転とは、同じ文字列を逆順に並べたものを指します。例えば以下のようになります。 元の文字列: Apple is red 反転後の文字列: der si elppA ここでは、再帰(リカーション)を利用して、文字列として与えられた文を反転して表示するC++プログラムを紹介します。 プログラム例 #include <iostream> using namespace std; void reverse(char *str) { if(*str == \0) return;
-
C#で文字列を反転させる方法【Array.Reverse()の使い方】
C#で文字列を逆順にする基本の方法C#で文字列を反転(リバース)したい場合は、Array.Reverse()メソッドを使うのが最もシンプルです。このメソッドは配列の要素の並びをその場で反転できるため、まず文字列を文字配列(char[])に変換してから適用する流れになります。手順1:反転したい文字列を用意する最初に、反転対象となる文字列を定義します。string str = "Amit";手順2:文字列を文字配列に変換するArray.Reverse()は配列に対して機能するため、ToCharArray()メソッドを使って文字列を文字配列へ変換します。char[] ch = s