Windows socket C言語プログラミング

14795 ワード

Windows socket C言語プログラミング関数の詳細
文書ディレクトリ
  • Windows socket C言語プログラミング関数詳細
  • WSADATA
  • WSAStartup
  • socket
  • sockaddr
  • sockaddr_in
  • inet_pton
  • setsockopt
  • bind()
  • connect()
  • recvfrom
  • sendto()

  • WSADATA
    WSAstartup関数によって呼び出された後に返される[Windows Sockets](https://baike.baidu.com/item/WindowsSockets)データ.Winsockが含まれていますdllが実行するデータ.
    WAS(Windows Sockets Asynchronous、Windows非同期ソケット)
    WSAstartup関数で呼び出されたWindows Socketsデータを格納します.Winsockが含まれていますdllが実行するデータ.
    typedef struct WSAData {
        WORD          wVersion; //          ,           
        WORD          wHighVersion;//   Windows Sockets       
    #ifdef _WIN64
        unsigned short     iMaxSockets;//         socket     
        unsigned  short    iMaxUdpDg;
        //                  (UDP)      ,      
        char FAR *       lpVendorInfo;
        char          szDescription[WSADESCRIPTION_LEN+1];//WinSockets     
        char          szSystemStatus[WSASYS_STATUS_LEN+1];//          
    #else
        char         szDescription[WSADESCRIPTION_LEN+1];
        char         szSystemStatus[WSASYS_STATUS_LEN+1];
        unsigned  short     MaxSockets;
        unsigned  short     iMaxUdpDg;
        char FAR *       lpVendorInfo;
    #endif
    } WSADATA;
    

    WSAStartup
    int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData )

    WSAstartup関数でWinsockサービスの初期化を完了し、Socketを使用する前にWSAstartup関数を呼び出す必要があります.
    wVersionRequested:プログラムが使用を要求したSocketバージョンを示します.上位バイトがサブバージョン、下位バイトがプライマリバージョンを示すWORD(2バイト)型の数値
    lpWsadata要求されたSocketのバージョン情報を返すためのWsadatAデータ構造へのポインタ
    例:
    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) /*MAKEWORD(2,2)    WINSOCK2  .wsd           WINSOCK   .*/
    {
    	cout << "WSAStartup Error = " << WSAGetLastError() << "
    "
    ; return; }

    MAKEWORD():符号なし16ビット整数を作成し、2つの与えられた符号なしパラメータを接続する
    WORD MAKEWORD(
    BYTE bLow, //          
    BYTE bHigh //          ;
    );
    

    socket
    lpWSAdata:Windows Sockets実装の詳細を受信するためのWSADATAデータ構造へのポインタ
    socket
    #include
    #include
    SOCKET  socket(int af, int type, int protocol);
    

    af:アドレスファミリー(Address Family)、すなわちIPアドレスタイプであり、よく使われるのはAF_INETとAF_INET6.
    INETは「Inetnet」の略です.AF_INETはIPv 4アドレスを表す.AF_INET 6は、1110::A 0 B 3:FA 21:48 AA:1 A 2 BのようなIPv 6アドレスを表す.
    type:データ転送方式/ソケットタイプで、よく使われるSOCK_STREAM(ストリームフォーマットソケット/接続向けソケット)とSOCK_DGRAM(データ・レポート・ソケット/接続されていないソケット)
    protocol:転送プロトコルを表し、よく使われるIPPROTO_TCP(TCP転送プロトコル)およびIPPTOTO_UDP(UDPトランスポートプロトコル).
    戻り値:SOCKETタイプのハンドル
    sockaddr
    struct sockaddr
    {
      unsigned short sa_family; //     AF
      char sa_data[14];   //14      
    };
    

    sa_を指定するとfamily=AF_INETの後、sa_dataの形式も固定されている:最先端の2バイトは16ビットのポートを記録し、続いて4バイトは32ビットのIPアドレスを記録し、最後の8バイトはゼロにクリアされる.
    sockaddr_in
    struct sockaddr_in
    {
        unsigned short sin_family; //   
        unsigned short sin_port; //     
        struct in_addr sin_addr;//  IP  ,  in_addr      
        char sin_zero[8];//   
    };
    

    sin_zero:sockaddrとsockaddrをin 2つのデータ構造が同じサイズで保持される空のバイト
    struct in_addr
    {
        unsigned long s_addr;
    };
    

    inet_pton
    inet_ptonはIPアドレス変換関数で、IPアドレスを「ポイント10進数」と「バイナリ整数」の間で変換でき、inet_ptonとinet_ntopの2つの関数はipv 4とipv 6を処理することができる.
    pとnはそれぞれ表現(presentation)と数値(numeric)を表す
    #include 
    int inet_pton(int af, const char *src, void *dst);     -----    
    

    af:アドレスクラスタ
    src:ソースアドレス
    dst:変換後のデータを受信します.
    戻り値:成功した場合は1、有効でない場合は0、エラーの場合は-1
    inet_ntop:数値フォーマット------ポイント10進数
    const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);     //              ip    
    

    戻り値:成功した場合は構造へのポインタ、エラーの場合はNULL
    setsockopt
    任意のタイプ、任意のステータススリーブインタフェースの設定オプション値.オプションは異なるプロトコル・レイヤに存在しますが、この関数では、最も高いソケット階層のオプションのみが定義されます.
    int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
    

    sockfd:ソケットインタフェースを設定する記述語.level:オプションが存在するプロトコル・レイヤ.サポートSOL_SOCKET、IPPROTO_TCP、IPPROTO_IPとIPPROTO_IPV 6 optname:設定するオプション名.optval:保存オプションが設定される新しい値のバッファを指します.optlen:optvalバッファ長
    戻り値:エラーが発生しない場合、setsockopt()は0を返します.
    そうでなければSOCKET_に戻りますERRORエラー、アプリケーションはWSAGEtLastError()を使用して対応するエラーコードを取得できます.
    エラーコード:
    WSANOTINTIALISED:このAPIを使用する前に、WSAstartup()を正常に呼び出す必要があります.
    WAENETDOWN:ソケットインタフェースはネットワークサブシステムの失効を検出することを実現する.
    WAEFAULT:optvalはプロセスアドレス空間の有効な部分ではありません.
    WAEINPROGRESS:ブロックされたソケット呼び出しが実行中です.
    WAEINVAL:level値が不正、またはoptvalの情報が不正です.
    WSINETRESET:SO_KEEPALIVE設定後接続タイムアウト.
    WSINOPROTOOPT:不明またはサポートされていないオプション.そのうち、SOCK_STREAMタイプのソケットはSO_をサポートしていませんBROADCASTオプション、SOCK_DGRAMタイプのソケットはSO_をサポートしていませんDONTLINGER 、SO_KEEPALIVE、SO_LINGERとSO_OOBINLINEオプション.
    WAENOTCONN:SO_を設定するとKEEPALIVE後に接続がリセットされます.
    WAENOTSOCK:記述語は一連のインタフェースではありません.
    bind()
    ローカルアドレスをインタフェースセットにバンドルします.この関数は、connect()またはlisten()呼び出し前に使用される未接続のデータ・レポートまたはストリーム・クラス・スイート・インタフェースに適用されます.
    ソケット()でソケットインタフェースを作成すると、名前空間(アドレスファミリー)に存在しますが、名前は付けられません.bind()関数は、名前のないソケットにローカル名を割り当てることで、ソケットにローカルバンドル(ホストアドレス/ポート番号)を確立します.
    #include 
    int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen);
    

    sockaddr:バンドルされていないインタフェースを識別する記述語
    sockaddr:ソケットインタフェースに付与されたアドレス
    addrlen: my_addrの長さ.
    戻り値:エラーが発生しない場合bind()は0を返します.そうでなければ、-1が返され、アプリケーションはWSAGEtLastError()を介して対応するエラーコードを取得できます.
    connect()
    connect()は、指定したsocketとの接続を確立するために使用されます.
     int connect(SOCKET s, const struct sockaddr * name, int namelen);
    

    戻り値:成功すると0、失敗すると-1を返します.
    recvfrom
    ソケットインタフェースからデータを受信し、データ送信元のアドレスを取得します.
    ssize_t recvfrom (int sockfd,  //          
                      void *buf,  //       
                      size_t len,  //     
                      unsigned int flags, //      
                      struct sockaddr *from, //           (  )
                      socket_t *fromlen);  //  from      (  )
    

    ssize_tはlong intに相当する
    socket_tはintに相当する
    戻り値:戻り受信バイト数を正しく受信し、失敗して-1を返す.
    パラメータflags:次の1つ以上のフラグのコンビネーションは、"|"オペレータで接続できます.
    ​ MSG_DONTWAIT:操作がブロックされない.
    ​ MSG_ERRQUEUE:ソケットのエラーキューからエラー値を受信すべきであることを示し、異なるプロトコルに基づいて、エラー値は何らかの補佐的なメッセージで伝達され、使用者は十分なバッファを提供すべきである.エラーの原因となる元のパッケージはmsg_を通過します.iovecは一般的なデータとして伝達される.エラーが発生したデータはmsg_として元のターゲットアドレスに報告されます.nameが提供されます.エラーはsock_extended_Err構造形態は以下のように定義されている.
    ​ #define SO_EE_ORIGIN_NONE 0
    ​ #define SO_EE_ORIGIN_LOCAL 1
    ​ #define SO_EE_ORIGIN_ICMP 2
    ​ #define SO_EE_ORIGIN_ICMP6 3
    ​ MSG_PEEK:データ受信後、元のデータを受信キューに保持し、削除しないことを示し、その後の読み出し操作で同じデータを受信することもできます.
    ​ MSG_TRUNC:提供されるバッファよりも長い場合でも、パッケージの実際の長さを返します.packetソケットにのみ有効です.
    sendto()
    接続が確立されていないUDPパケット(パラメータSOCK_DGRAM)の送信に適した、指定された宛先へのデータの送信を指す.
    int sendto(
    	int s, //      socket,  UDP           
    	const void * msg, //    
    	int len, //msg  
    	unsigned int flags, //   0
    	const struct sockaddr * to, //sockaddr  
    	int tolen  //sockaddr     
    );