Unixソケットプログラミング

出典: フリー教科書『ウィキブックス(Wikibooks)』
プログラミングUnixソケットプログラミング

ソケット (Socket)は、コンピュータネットワークプログラミングにおいて一般的に使用されるAPI(アプリケーションプログラムインタフェース)の一つです。 Socket APIは、ソケットと呼ばれる通信エンドポイントを作成し、ネットワーク上でデータを送受信するための標準化された方法を提供します。 Socket APIは、初めてバークレー大学で開発されたBerkeleyソフトウェアディストリビューション(BSD)の一部として導入され、その後、UNIXおよびUNIX系オペレーティングシステムで広く使用されました。Socketは、ネットワーク通信のさまざまな側面をサポートし、プロトコルスタック(通信プロトコルのセット)とのインタラクションを容易にします。

主な特徴と機能には以下が含まれます:

ソケットの作成と管理
プログラムはソケットを作成し、通信のために使用するポートとIPアドレスをバインドしたり、接続を待機したり、接続を確立したりすることができます。
データ送受信
プログラムはソケットを使用してデータを送信および受信できます。TCP(Transmission Control Protocol)やUDP(User Datagram Protocol)などのさまざまなプロトコルをサポートしています。
ノンブロッキング通信
プログラムはSocketをノンブロッキングモードで使用でき、非同期通信を実現することができます。
マルチスレッディング
複数のスレッドがソケットを同時に使用し、ネットワーク通信を並行して処理できます。
セキュリティ
Socketはセキュリティプロトコルの実装にも使用でき、SSL/TLSなどのセキュアな通信をサポートします。

Socket APIは、さまざまなプログラミング言語(C、C++、Pythonなど)で利用可能であり、ネットワークプログラミングやソケットプログラミングにおいて幅広く採用されています。そのため、ネットワークアプリケーション、Webサーバ、クライアントアプリケーション、インターネットプロトコルの実装など、さまざまな用途で使用されています。


目次[編集]

今後の学習案内[編集]

関連ページ[編集]

※ 未分類[編集]

※ 完成したら、適切なサブページに移動、もしくはサブページを適切に作成してください。

cURLライブラリ[編集]

cURLライブラリとして、

curlコマンドと、
libcurlライブラリ

がある。

Fedora の場合、初期状態でインストール済みであると思われる。(まだOSクリーンインストールしていないので、まだ未確認。)


curlコマンド[編集]

Linuxの場合、実は「cURL」と言われるライブラリ群があり、HTTP通信やFTP通信の場合は、そのcurlライブラリを介しても作業できる。

cURLライブラリ群のひとつに、同名の「curl」コマンドというのがある。

curlコマンドの機能として、curlがOSにインストールされていると、

たとえば、webサーバのローカルホストに detarame.html というのがあるなら、

curl http://localhost/detarame.html

でコマンドライン(terminal)からアクセスでき、結果を表示できる。(わざわざC言語でprintf関数などを書く必要が無い。)


telnetコマンドとの違いとして、curlコマンドではGETメッセージが不要である。


なお、上記curlコマンドは

curl localhost/detarame.html

のようにhttpを省略してもいい。


一般的には、curlコマンドの書式は

curl URL

である。URLに、目的のwebサイトのwebアドレスが入る。(webアドレスとは、webブラウザでアクセスする場合のアドレス欄に入る識別子のことで、「http:// 」なんとかが書かれている部分のこと。普通、webブラウザの画面の上部のほうに、webアドレス欄がある。)

利点として、DNSサーバにわざわざ問い合わせるコマンドを使う必要が無い。


対応プロトコル

curlコマンドの対応プロトコルはHTTPだけでなく、ファイルサーバによく使われるFTPや、メールのSMTPなど、多くのプロトコルに対応している。


インストール方法

Fedora Linux の場合

sudo dnf install curl

で入る。

もっとも、初期状態で最初から入っていると思われる。(まだOSクリーンインストールしていないので、まだ未確認。)

備考

Windows10に2018年以降、cURL同等品のバイナリが標準でWindows10に付属するようになり、cURlコマンドが以降のWindows10の最新バージョンでも使えるようになっている。

libcurl[編集]

libcurl は、C言語プログラムにおいて、curl相当の機能をcurl独自関数を使うことができる。

curlコマンドとは別物である。

libcurlは、terminalのコマンドではなく、C言語に組み込んで使うものである。


インストール方法

Fedora Linux の場合、C言語用のcurlライブラリ開発環境として「libcurl-devel」を追加インストールする必要があり、コマンド

sudo dnf install libcurl-devel

で入る。

なお、「libcurl」と「libcurl-devel」とは異なる。libcurlを使用するC言語プログラムの開発に必要なのが「libcurl-devel」である。それを使って完成したプログラムの実行に必要なのが「libcurl」である。


使い方

公式サイトにサンプルコード https://curl.haxx.se/libcurl/c/example.html がある。

任意の変数に書き込むには、CURLOPT_WRITEFUNCTION

https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html

を使ってコールバック変数を定義する必要があり、初心者にとってはあまり直感的な仕様ではない。


日本のネット界隈だと、「libcurlを使うと簡単にHTTPクライアントを作れる」みたいな知ったか振りの言説が匿名掲示板などで散見されるが、実態は上記リンク先のサンプルコードのように、curlコマンドほどには、libcurlのC言語プログラミングは直感的ではない。

単に簡単にHTTP通信をするプログラミングをしたいなら、ソケット通信で直接にプログラミングするほうが、libcurlよりも平易であるのが(ネット掲示板の知ったか振りとは異なる)真相である。

関連事項[編集]

WindowsのWinINET[編集]

Windowsだと、WinINETという、ソケット通信を省略してHTTP通信やFTP通信など主要なプロトコルの通信をできるAPI群が用意されている。

しかし、LinuxやBSDなどに、それに対応するものはAPIは無い。

どうしても、素のソケット通信をしたくない場合、cURLのように(APIではなく)ライブラリを使うことになる。


なお、 名前の似ている <netinet/in.h> ヘッダをインクルードしても、 残念ながら WinInetのような特定プロトコルに対応したAPI機能は <netinet/in.h> ヘッダでは提供されていない。

wget[編集]

なお、コマンドでは、cURLのほか、wgetというコマンドもあり、wgetはHTTPおよびFTPに対応しているが、しかしC言語に組み込んで使うライブラリが無いか(libwgetというのが検索しても見つからない)、あってもマイナーである。

なお、wgetとcURLはライセンスが異なり、libcurlは比較的に制限のゆるいMITライセンスであるが、wgetは制限のきついGPLライセンスである。

なお、wgetはダウンロードツールであるので、wgetコマンドを実行すると、ダウンロードが始まる。(telnetとは違い、一般のHTTP通信を目的としたものではない。) wgetでダウンロードされたファイルの保存先は、特に指定しないかぎりカレントディレクトリーである。