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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ソケットの概要
- TCP サーバー
- TCP クライアント
- 複数クライアントの処理