hapter 02練習問題-追加関数の紹介


本書61ページではChapter 02の練習問題を解き、新しいウィンウィン関数をまとめてみました.

WSASetLastError

WSASetLastError()関数はwinsock2.hに存在し、WSAGetLastError()関数で検索できるエラーコードを設定する関数です.
関数の定義は次のとおりです.
void WSASetLastError(
	int iError
);
  • iError:1つの整数WSAGetLastError()関数呼び出しで返されるエラーコードを指定
  • WSASocket

    WSASocket()関数はwinsock2.hに存在し、特定のトランスポートサービスプロバイダにバインドされたソケットを作成する関数であり、socket()関数のユニークな機能を有する.
    関数の定義は次のとおりです.
    // 성공: 새로운 소켓, 실패: INVALID_SOCKET
    SOCKET WSASocket(
    	int					af,
        int					type,
        int					protocol,
        LPWSAPROTOCOL_INFOA	lpProtocolInfo,
        GROUP				g,
        DWORD				dwFlags
    );
  • af:指定アドレス体系
  • type:コンセントタイプ指定
  • プロトコル:使用するプロトコルを指定
  • lpprotocolInfo:生成するソケットの特性を定義するためのWSAPROTOCOL_INFO構造体のポインタ.NULLでない場合、ソケットはWSAPROTOCOL_INFO構造体に接続されたプロバイダにバインドされます.
  • g:既存コンセントグループIDまたは新規コンセントおよび新規グループを生成する際のルール.g既存ソケットグループIDでない場合は、以下の値を使用できます.
  • 0:パケット化は行わない.
  • SG UNCONTRAID GROUP(0 x 01):無拘束ソケットグループを作成し、新しいソケットを最初のメンバーとして指定します.Winsockは、制限されていないグループについて、ソケットグループ内のすべてのソケットがタイプとプロトコルパラメータと同じ値を作成することを制限しません.
  • SG CONTRAID GROUP(0 x 02):制限付きソケットグループを作成し、新しいソケットを最初のメンバーとして指定します.制限付きソケット・グループの場合、Winsockはソケット・グループ内のすべてのソケットをタイプとプロトコル・パラメータの同じ値に制限します.制限付きソケットグループは、接続を指すソケットのみで構成され、すべてのパケットソケットの接続は、同じホストの同じアドレスにある必要があります.
    リファレンス
    SG UNCONTRAID GROUPおよびSG CONTRAID GROUP定数は、現在、共通タイトルファイルに定義されていません.
  • deFlags:他のソケット属性を指定するためのタグ
  • WSAPROTOCOL_INFO

    WSAPROTOCOL_INFO構造体定義winsock2.hにおいて、所定のプロトコルに関する完全な情報を格納または取得するために使用される.
    構造体の定義は次のとおりです.
    typedef struct _WSAPROTOCOL_INFO
    {
    	DWORD            dwServiceFlags1;
    	DWORD            dwServiceFlags2;
        DWORD            dwServiceFlags3;
      	DWORD            dwServiceFlags4;
      	DWORD            dwProviderFlags;
      	GUID             ProviderId;
      	DWORD            dwCatalogEntryId;
      	WSAPROTOCOLCHAIN ProtocolChain;
      	int              iVersion;
      	int              iAddressFamily;
      	int              iMaxSockAddr;
      	int              iMinSockAddr;
      	int              iSocketType;
      	int              iProtocol;
      	int              iProtocolMaxOffset;
      	int              iNetworkByteOrder;
      	int              iSecurityScheme;
      	DWORD            dwMessageSize;
    	DWORD            dwProviderReserved;
      	CHAR             szProtocol[WSAPROTOCOL_LEN + 1];
    } WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;
  • dwServiceFlag 1-5:プロトコルで提供されるサービスのビットマスク.可能な値はwinsock2.hで定義してもよいし、他のプロトコルで定義してもよい.
  • dwProviderFlags:Winsockディレクトリでのプロトコルの表示方法をマークします.可能な値はwinsock2.hで定義します.
  • ProviderId:サービスプロバイダベンダーによってベンダーに割り当てられるグローバル一意の識別子.この値は、複数のサービスプロバイダが特定のプロトコルを実装できる場合に便利です.アプリケーションは、ProviderIdメンバーを使用して、区別できないプロバイダを区別できます.
  • プロトコルチェーン:プロトコル関連WSAPROTOCOLCHAIN構造体
  • iVersion:プロトコルバージョン
  • iAddressシリーズ:プロトコルスロットを開くためのスロットまたはWSASocket()関数に渡すafパラメータ値
  • iMaxSockAddr:最大アドレス長(バイト単位)
  • iMinSockAddr:最小アドレス長(バイト単位)
  • iSocketType:プロトコルのソケットを開くソケットまたはWSASocket()関数に渡すtypeパラメータ値
  • iProtocol:プロトコルのスロットを開くためのスロットまたはWSASocket()関数に渡す値protocolパラメータ
  • iProtocol Max Offset:ソケットまたはWSASocket()関数protocolパラメータ転送時iProtocol追加可能な最大値
  • iNetwordByteOrder:大エディアン(0)または小エディアン(1)の整数を表す
  • iSecurityScheme:使用するセキュリティシステムタイプ
  • dwMessage Size:プロトコルがサポートする最大メッセージサイズ(バイト単位)
  • dwProviderReservice:サービスプロバイダに予約しておく.
  • szプロトコル:読めるプロトコル名を含む文字列.許容される最大文字数はWSAPROTOCOL_LEN225文字と定義されています.
  • 参考資料
    金成祐著、「TCP/IPウィンドウソケットプログラミング」、星光学院、2018
    https://docs.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-wsasetlasterror
    https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa
    https://docs.microsoft.com/en-us/windows/win32/api/winsock2/ns-winsock2-wsaprotocol_infoa