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

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動
プログラミングUnixソケットプログラミング

「ソケット通信」または単に「ソケット」(socket)とは、C言語などのプログラミング言語で、インターネット通信をする際などに必要になる機能群のこと。(ホームページ作成ではなく)webブラウザそのものを作成する場合や、PHPやPerlなどのようなネット通信の機能の搭載されたプログラム言語そのものを作成する場合などに、OSの提供するソケットAPIを利用することが必要になる。

目次[編集]

今後の学習案内[編集]

関連ページ[編集]

※ 未分類[編集]

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

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でダウンロードされたファイルの保存先は、特に指定しないかぎりカレントディレクトリーである。