ソケットの概要
ネットワーク通信の基礎です。
「ソケットの概要」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
ソケットとは
ソケットは、ネットワーク通信の終端点です。POSIXシステムでは、読み取りと書き込みができるファイルディスクリプタであり、2つのプログラムがネットワーク経由または同じマシン上でデータを交換できるようにします。
クライアント・サーバーモデル
ほとんどのネットワークアプリケーションは、クライアント・サーバーモデルを使用します。
- サーバーはアドレスにバインドし、接続を待ち受ける
- クライアントはサーバーへの接続を開始する
接続が確立すると、双方がデータを送受信します。
TCPとUDPの比較
主なトランスポートプロトコルは2つあります。
- TCP(SOCK_STREAM):信頼性があり、順序が保証され、コネクション型
- UDP(SOCK_DGRAM):高速でコネクションレス、パケットが失われたり順序が入れ替わったりする可能性がある
正確性が必要な場合はTCP、低遅延のストリーミングにはUDPを使用してください。
ソケットの作成
socket()呼び出しはファイルディスクリプタを返します。引数は、アドレスファミリ(IPv4の場合はAF_INET)、タイプ(TCPの場合はSOCK_STREAM)、プロトコル(デフォルトの場合は0)です。
/* Conceptual: sockets need a network environment to run */
#include <sys/socket.h>
#include <netinet/in.h>
int create_tcp_socket(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
/* fd < 0 means error; check with perror */
return fd;
}ソケットアドレス構造体
IPv4アドレスはstruct sockaddr_inで表され、ファミリ、ポート、IPアドレスを保持します。関数は汎用的なstruct sockaddr *を受け取るため、キャストします。
#include <netinet/in.h>
void fill_addr(struct sockaddr_in *addr, unsigned short port) {
addr->sin_family = AF_INET;
addr->sin_port = htons(port); /* host to network short */
addr->sin_addr.s_addr = INADDR_ANY; /* all interfaces */
}バイト順序に注意する
ネットワークではビッグエンディアン(ネットワークバイトオーダー)を使用します。次の関数で変換してください。
htons/htonlホストからネットワークへ(short/long)ntohs/ntohlネットワークからホストへ
ポートとアドレスは必ず変換してください。変換しないと、意図しない相手と通信することになります。
IPアドレスの変換
inet_ptonは、"127.0.0.1"のようなテキスト形式のIPアドレスを、sin_addrに格納されるバイナリ形式へ変換します。inet_ntopはその逆を行い、表示用の形式に戻します。
#include <arpa/inet.h>
#include <netinet/in.h>
int set_ip(struct sockaddr_in *addr, const char *ip) {
return inet_pton(AF_INET, ip, &addr->sin_addr); /* returns 1 on success */
}サーバーの呼び出し順序
TCPサーバーは通常、次の順序で呼び出します。
socket()作成bind()アドレスとポートに関連付けlisten()パッシブ状態に設定accept()接続を取得
クライアントの呼び出し順序
TCPクライアントはより単純です。
socket()作成connect()サーバーのアドレスへ接続
その後、同じディスクリプタでsendとrecvを実行できます。
送受信
send()とrecv()(または汎用的なwrite()とread())を使用します。どちらも要求したバイト数より少ないバイト数しか転送しない場合があるため、実際のコードではすべてのデータを処理するまでループします。
戻り値を必ず確認する
すべてのソケット呼び出しは失敗する可能性があります。戻り値が-1の場合はerrnoが設定されるため、perrorを呼び出して報告します。recvが0を返した場合は、相手が接続を閉じたことを意味します。堅牢なネットワーク処理では、エラーチェックが成否を左右します。
理解度チェック
ソケットの基本についての理解度を確認しましょう。
まとめ
ソケットプログラミングの基礎を学びました。
- ソケットはネットワークの終端点であり、ファイルディスクリプタでもある
- クライアント・サーバーモデルでは、信頼性の高いTCPまたは高速なUDPを使う
htonsとinet_ptonを使ってsockaddr_inを扱う- サーバー:socket、bind、listen、accept。クライアント:socket、connect
よくある質問
「ソケットの概要」レッスンは無料ですか?
はい。「ソケットの概要」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「ソケットの概要」で何を学びますか?
ネットワーク通信の基礎です。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ソケットの概要」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。