次に、クライアント側のコード例です。このコードは、サーバーとのソケット通信が切断されたら自動で再接続しようとするものです。再接続の間隔は指数関数的に増やしていきます。
// クライアント側
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 12345 // ポート番号
#define SERVER_IP "127.0.0.1" // サーバーのIPアドレス
int main(void)
{
int client_fd; // クライアント用FD
struct sockaddr_in server_addr; // サーバーのアドレス構造体
char buf[256]; // バッファ
int n; // 受信・送信したバイト数
int retry = 1; // 再接続の回数
int interval = 1; // 再接続の間隔(秒)
while (1) {
// ソケットを作成する(socket)
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
perror("socket");
exit(1);
}
// サーバーのアドレス構造体を設定する
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
// サーバーに接続する(connect)
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
printf("Retry %d times after %d seconds.\n", retry, interval);
close(client_fd); // ソケットを閉じる
sleep(interval); // 指定秒待つ
retry++; // 再接続回数を増やす
interval *= 2; // 再接続間隔を倍にする
continue;
}
printf("Connected to server.\n");
// データを送信する(send)
strcpy(buf, "Hello!");
n = send(client_fd, buf, strlen(buf), 0);
if (n == -1) {
perror("send");
exit(1);
}
// データを受信する(recv)
n = recv(client_fd, buf, sizeof(buf), 0);
if (n == -1) {
perror("recv");
exit(1);
}
if (n == 0) { // サーバーが切断された場合
printf("Server disconnected.\n");
close(client_fd); // ソケットを閉じる
break;
} else { // データが受信できた場合
printf("Received from server: %s\n", buf);
// 受信したデータに応じて処理を行う(ここでは省略)
}
close(client_fd); // ソケットを閉じる
break; // 無限ループから抜ける
}
return 0;
}
以上が、C言語で複数のクライアントと通信できるサーバーと、サーバーとの再接続機能を持つクライアントのコード例です。実際に動かしてみて、ソケット通信の仕組みや挙動について理解してみてください。
もし、この記事が役に立ったり、面白かったりしたら、ぜひコメントやいいねなどしてください!
コメント