winsockプログラミング

ここでは、WinSockを使ったWindowsネットワークプログラミングの説明を行いたいと思います。 ここで対象としている読者は、ネットワークプログラミング初心者(もしくは入門者)かつWindows環境でプログラミングを行いたい人です。

WinSockという名称は、Windows Socketsから来ています。 名前の通り、Winsockはウィンドウズでソケットを使ってプログラムを書くためのAPI(Application Program Interface)です。 Winsockを使うと、TCP/IPなどインターネットを使って通信を行うプログラムが書けます。

ここで説明を行うwinsockのバージョンは2.0です。 ただし、大枠に関してはversion 1.0と2.0で同じ部分もあるので1.0を利用する方でも参考にはなると思います。 Winsockが対応するWindowsのバージョンとしては95、98、Me、NT、2000、XP、2003、server、など全てのバージョンです。 なお、私はWindowsXP+Visual Studio .NET 2003という環境でサンプルプログラムを作成しています。

winsockを使う準備

winsockを使ってネットワークプログラミングを行うにはwinsock.hもしくはwinsock2.hをincludeしなくてはいけません。 細かいことをしない予定であれば、どちらをincludeしても動いてしまいますが、winsock2を使うのであればwinsock.hよりもwinsock2.hをincludeした方が良いでしょう。 winsock機能を使うソースコードの前半に以下の行を追加します。


#include <winsock2.h>

次に、winsockライブラリにリンクする設定を行わなければなりません。 「リンカ > 入力 > 追加する依存関係」にws2_32.libを追加してください。 ws2_32.libには、ネットワークを使うためのライブラリが含まれています。

以上の設定でwinsock機能を使ったプログラムをコンパイルできるようになります。

  • なお、C言語そのものが初めての方は「C言語入門」も参考にどうぞ。Windows専用には書いてませんが主にC言語で共通の部分を解説しています。

実際にプログラミング

では、実際にネットワークを使って通信を行うコードを書きながらwinsockの説明をしていきたいと思います。 以下には、winsockだけではなく一部ネットワーク自体に関する説明も含まれます。

はじめに

サンプルコード利用方法

winsock全般

Winsockの初期化

socketの作成

エラー内容の取得

TCP

TCPを使う

TCPを使う(サーバ)

TCPを使う(サーバ、エラー処理付き)

TCPを使う(acceptした相手の確認)

TCPを使う(サーバ、SO_REUSEADDR)

HTTPサーバの作成(TCPサーバサンプル)

TCPを使う(クライアント、inet_addr、gethostbyname)

TCPを使う(クライアント、gethostbyname)

TCPを使う(クライアント、エラー処理付き)

HTTPクライアントの作成(TCPクライアントサンプル)

HTTPクライアントの作成(2)

UDP

UDPを使う

UDPでブロードキャストを使う

UDPでマルチキャストを使う

その他

IPアドレスからホスト名への変換(gethostbyaddr)

selectの利用

selectの利用(タイムアウト付き)

ノンブロッキング設定

IPv6

getaddrinfo(単純な例)

getaddrinfo(getaddrinfoを使ってsockaddrを作成する)

getaddrinfo(一番使いそうな例)

getaddrinfo(example.comの名前解決)

winsockの落とし穴

inet_ntoaの落とし穴

gethostbynameの落とし穴

setsockopt/getsockopt+IPPROTO_IPの落とし穴

資料集

Winsock2ソケット関連API

Winsock2 DB 関連API

Winsock2 WSA API

アドレスファミリ

ソケットタイプ

winsockエラーコード


winsock関連情報

IPHLPAPI(IP Helper API)

winsockでは、機器内のインターフェース、経路、DNSなどに関する情報を取得できません。 それらの情報を取得するAPIとして、WindowsではPlatform SDKの中にIP Helper APIが提供されています。 IP Helper APIの説明と使い方に関してはこちらをご覧ください。

インターネット入門(基礎技術)
インターネットの仕組みを初心者向けに説明しています。
Windows 2000/XP ネットワークコマンド
Windows2000/XPを使ってネットワークの構築やトラブルシューティングを行う上で最低限知っておきたいコマンドを紹介しています。
参考文献
より詳しくwindowsでのネットワークプログラミングを知りたいという方はこちらの参考文献をどうぞ。
Visual Studio
ウィンドウズプログラミングの標準環境です。
Linuxネットワークプログラミング
Windowsではなく、Linuxのネットワークプログラミングを知りたい場合にはこちらをご覧ください。
Perlネットワークプログラミング
Perlによるネットワークプログラミング解説です。

IPv6基礎検定

YouTubeチャンネルやってます!