Windowsネットワークプログラミングの基礎知識

3177 ワード

1.WinSockの初期化
#include<iostream>
#include<WinSock2.h>
#include<MSWSock.h>

#pragma comment(lib, "WS2_32.lib")//  WinSock2.h ,     

using namespace std;


//Winsock2    WSA  ,  WSAStartup WSACleanup WSARecvEX WSAGetLastError

int main()
{
    WSADATA wsData;
    if (SOCKET_ERROR == WSAStartup(MAKEWORD(2, 2), &wsData))//   2     
    {
        cout << "     !" << endl;
    }
    cout << "    :" << (int)LOBYTE(wsData.wHighVersion) << endl;//           
    cout << "    " << (int)HIBYTE(wsData.wHighVersion) << endl;

    WSACleanup();
    system("pause");
    return -1;
}

2.エラーチェックと処理
WSAGetLastError
WSASetLastError        

3.
typedef struct sockaddr_in {
    ADDRESS_FAMILY sin_family;
    USHORT sin_port;
    IN_ADDR sin_addr;
    CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

sin_familyはAF_でなければなりませんINETは、WinSockがIPアドレス族sinを使用していることを知らせる役割を果たす.zero[8]SOCKADDR_INとSOCKADDRの構造長は同じである.SOCKADDRは、void*に相当する汎用ソケットアドレスです.
バイトソートの異なるコンピュータプロセッサはbig-endianまたはlittle-endian形式で符号化される場合があります.Internetネットワーク規格は、マルチバイト値をbig-endian形式で表す必要があることを指定し、一般的にネットワークバイト順と呼ぶ.次の4つの共通API関数は、ホストバイト順からネットワークバイト順に1つの数を変換します.
WSAHtonl//4  
htonl
WSAHtons//2  
htons

逆に
WSANtohl
ntohl
WSANtohs
ntohs

もう一つの一般的な関数は、ポイントIPアドレスを4バイト整数srvAddrに変換する.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);
SOCKADDR_IN srvAddr;
srvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
srvAddr.sin_family = AF_INET;
srvAddr.sin_port = htons(DefaultPort);

INADDR_ANYはサーバに送信されたすべてのこのポートを表し、どのNIC/どのIPアドレスで受信したデータも、このソケット処理に渡されます.