0Pricing
C Academy · レッスン

TCP クライアント

接続して送信します。

「TCP クライアント」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

TCPクライアントの構築

TCPクライアントはサーバーに接続し、その後でデータを送受信します。ライフサイクルはサーバーより短く、ソケットを作成し、接続し、通信してから閉じます。

ステップ1:ソケットを作成する

サーバーと同じように、IPv4 TCP用のストリームソケットを作成します。

#include <sys/socket.h>
#include <stdio.h>

int make_client_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) perror("socket");
    return fd;
}

ステップ2:サーバーを記述する

サーバーのポートとIPをsockaddr_inに設定します。inet_ptonを使って、ドット区切りのIP文字列をバイナリ形式に変換してください。

#include <arpa/inet.h>
#include <netinet/in.h>

int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
    addr->sin_family = AF_INET;
    addr->sin_port = htons(port);
    return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}

ステップ3:接続する

connect()はサーバーとのTCPハンドシェイクを実行します。成功するとソケットはデータを送受信できる状態になり、失敗するとerrnoが設定されます(例:接続拒否)。

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int do_connect(int fd, struct sockaddr_in *addr) {
    if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
        perror("connect"); return -1;
    }
    return 0;
}

bindは不要

クライアントでは通常、bindを省略します。connect中にカーネルがエフェメラルな送信元ポートを自動的に割り当てるためです。特定の送信元ポートが必要な場合にだけ、クライアントでbindを実行します。

ステップ4:データを送信する

接続後、sendでリクエストを書き込みます。バッファ全体が送信されるようにループしてください。

#include <sys/socket.h>
#include <string.h>

int send_all(int fd, const char *data) {
    size_t left = strlen(data);
    const char *p = data;
    while (left > 0) {
        ssize_t n = send(fd, p, left, 0);
        if (n <= 0) return -1;
        p += n; left -= (size_t)n;
    }
    return 0;
}

ステップ5:応答を受信する

recvでサーバーの応答を読み取ります。バッファを文字列として扱う前に、NULL終端してください。

#include <sys/socket.h>
#include <stdio.h>

void read_reply(int fd) {
    char buf[512];
    ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
    else if (n == 0) printf("server closed connection\n");
}

接続が閉じるまで読み取る

1回のrecvで応答全体を取得できるとは限りません。分割されて届く応答全体を読み取るには、recvが0(相手が接続を閉じた状態)を返すまでループします。

#include <sys/socket.h>
#include <stdio.h>

void drain(int fd) {
    char buf[256]; ssize_t n;
    while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
        fwrite(buf, 1, (size_t)n, stdout);
}

ステップ6:閉じる

close(fd)を呼び出して接続を終了し、ディスクリプタを解放します。これによりTCP FINが送信され、サーバーはクライアントの処理が完了したことを認識できます。

#include <unistd.h>

void finish(int fd) {
    close(fd);
}

shutdownによるハーフクローズ

shutdown(fd, SHUT_WR)は書き込み方向だけを閉じます。これによりリクエストの終了を通知しながら、クライアントは引き続き応答を読み取れます。リクエスト後に応答を受け取るプロトコルで役立ちます。

接続失敗への対処

クライアントでよく発生するエラーには、ECONNREFUSED(接続を待ち受けているサーバーがない)、ETIMEDOUT(ホストに到達できない)、EHOSTUNREACH があります。必ず connect の結果を確認し、失敗した場合はユーザーに明確に伝えてください。

理解度チェック

TCP クライアントについての理解度を確認しましょう。

まとめ

TCP クライアントを構築しました。

  • socket を作成し、サーバーの sockaddr_in に対して connect します
  • bind は必要ありません。カーネルが送信元ポートを選択します
  • リクエストを send し、応答を recv します(データ全体を受信するにはループします)
  • 処理が終わったら close または shutdown を呼び、connect の失敗にも対処します

よくある質問

「TCP クライアント」レッスンは無料ですか?

はい。「TCP クライアント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「TCP クライアント」で何を学びますか?

接続して送信します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「TCP クライアント」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ソケットの概要
  2. TCP サーバー
  3. TCP クライアント
  4. 複数クライアントの処理
← C Academyに戻る