ソケットの作成

WinSock は Windows ネットワークプログラミングの基礎です。
Web サーバーや FTP サーバーのプログラムをコンパイル言語とすると、WinSock のプログラムはアセンブラ言語に相当します。
まず最初に DOS モードで Winsock を初期化して、ソケットを作成してみましょう。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの概要

  1. インターネットに接続する必要はありませんが、ネットワーク機能が設定されていなければなりません。
  2. WinSock は Windows Sockets の略称で、ソケットを使ってプログラムを書くための API です。
  3. winsock 機能を利用するには WSAStartup() 関数で winsock の初期化を行います。
  4. 次に socket() 関数でソケットを作成します。
    ソケットとは、通信するデータの出入り口です。
    ユーザはソケットに対してデータを書き込んだり読み込んだりするだけで通信が行えます。
  5. ソケットは、二つ以上のソケットが互いに関係を持つことではじめて有効になります。
  6. 今回はソケットを作成するだけなので通信はできませんが、Winsock の初期化とソケットの作成方法を学んで下さい。

プロジェクトの作成

  1. Win32 コンソールアプリケーションを作成して main.cpp をプロジェクトに追加します。
  2. winsock2.h をインクルードして ws2_32.lib をリンクしなければならないのですが #pragma でリンクするので特に操作は不要です。
  3. ネットワークが起動する環境で、ビルドに続いて Main.exe を実行して下さい。
  4. 正常に実行できた場合は、次のメッセージが順番に表示されるので確認して何かキーを押して下さい。
    printf("winsock の初期化を行いました\n");
    printf("ソケットを作成しました\n");
    printf("Cleanup して終了します\n");
  5. 失敗したときは、次のメッセージが表示されます。
    printf("winsock の初期化に失敗しました\n");
    printf("ソケットの作成に失敗しました\n");

プログラムの説明

  1. winsock2.h をインクルードして ws2_32.lib をリンクして下さい。
    conio.h は getch() でメッセージを確認するためにインクルードしています。
        #include <stdio.h>
        #include <conio.h>
        #include <winsock2.h>
        #pragma  once
        #pragma  comment(lib,"ws2_32.lib")
        
  2. WSAStartup() 関数で Winsock を初期化します。
    2.0 は Winsock のバージョンです。
    wsaData には Winsock の情報(あまり役に立たない)が格納されます。
    ゼロ以外がリターンされたときは、初期化の失敗でエラーコードがリターンされます。
        int  main()
        {   WSADATA wsaData;
            SOCKET  sock;
    
            if (WSAStartup(MAKEWORD(2,0), &wsaData))
            {   printf("winsock の初期化に失敗しました\n");
                getch();
                return 1;
            }
            printf("winsock の初期化を行いました\n");
            getch();
        
  3. socket() でソケットを作成します。
    socket() 関数は三つの引数を取ります。
    通信路で使われるプロトコルは、アドレスファミリ、ソケットタイプ、プロトコルの三つの組み合わせにより決定します。
    socket() 以外に WSASocket() という正規の winsock 関数もありますが、socket() の方がわかりやすいでしょう。
    今回は使われることの多い TCP のソケットを作成しています。
    TCP(Transmission Control Protocol) と UDP(User datagram protocol) では、ソケットを作った後の処理が大きく異なります。
            sock= socket(AF_INET,           //アドレスファミリ
                         SOCK_STREAM,       //ソケットタイプ
                         0);                //プロトコル
            if (sock == INVALID_SOCKET)
            {   printf("ソケットの作成に失敗しました\n");
                getch();
                return 1;
            }
            printf("ソケットを作成しました\n");
            getch();
        
  4. closesocket() でソケットをクローズして、WSACleanup() で Winsock を Cleanup して終了です。
            closesocket(sock);
            WSACleanup();
            printf("Cleanup して終了します\n");
            getch();
            return 0;
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)