0Pricing
C++ Academy · レッスン

C++のBSDソケットAPI

C++プログラムでsocket、bind、listen、accept、connect、send、recvを使います。

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

ソケットAPIとは

BSDソケットAPIは、ネットワークプログラミングにおけるデファクトスタンダードです。Linux、macOS、BSD系OSで利用でき、WindowsでもWinsockを介して(一部調整は必要ですが)利用できます。

必要なヘッダー

プラットフォームのヘッダーをインクルードし、POSIX型を使用します。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

ソケットの作成

socket呼び出しはファイルディスクリプターを返します。アドレスファミリー(IPv4)、タイプ(TCPまたはUDP)、プロトコル(デフォルトは0)を渡します。

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    perror("socket");
    return 1;
}

アドレス構造体

struct sockaddr_inはIPv4アドレスとポートを保持します。関数に渡す際はstruct sockaddr*にキャストします。

struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

バイトオーダー:ホストとネットワーク

ネットワークバイトオーダーはビッグエンディアンです。変換にはhtons、htonl、ntohs、ntohlを使用します。

クライアントの接続

TCP接続を開始するにはconnectを使用します。

if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
    perror("connect");
    close(sock);
    return 1;
}

送信と受信

sendとrecvはバイト列を交換します。どちらも要求したバイト数より少ない量を処理して返すことがあるため、必ずループしてください。

const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);

char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';

バインドとリッスン(サーバー)

サーバーはアドレスにバインドし、リッスンして、接続を受け付けます。

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);

ソケットのクローズ

Unixではcloseを、Windowsではclosesocketを呼び出します。

close(sock);

エラー処理

ソケット関数はエラー時に-1を返し、errnoを設定します。すべての戻り値を確認してください。

RAIIでラップする

生のファイルディスクリプターは簡単にリークします。デストラクターでcloseを呼び出すRAII型でラップするか、カスタムデリーター付きのstd::unique_ptrを使用してください。

struct SocketCloser {
    void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;

Windowsでの違い

Windowsでは、次のようにします。

  • <winsock2.h>をインクルードし、ws2_32をリンクする
  • 使用前にWSAStartupを呼び出す
  • closeの代わりにclosesocketを使用する
  • ソケット型はSOCKET(符号なし)である

確認問題

クライアントからサーバーへのTCP接続を開始する関数呼び出しはどれですか。

まとめ

BSDソケットAPIは、低レベルのネットワーク機能を提供します。ソケットを作成してアドレスを設定し、その後、クライアントではconnect、サーバーではbind+listen+acceptを実行します。バイトオーダーはhtons系の関数で変換します。ディスクリプターはRAIIでラップして、リークを防いでください。

よくある質問

「C++のBSDソケットAPI」レッスンは無料ですか?

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

「C++のBSDソケットAPI」で何を学びますか?

C++プログラムでsocket、bind、listen、accept、connect、send、recvを使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「C++のBSDソケットAPI」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. C++のBSDソケットAPI
  2. TCPエコーサーバーの構築
  3. epollとkqueueによる非同期I/O
  4. Boost Asioで現代的な非同期I/Oを使う
← C++ Academyに戻る