Windowsネットワークプログラミング

6549 ワード

私の新しいブログに注目してください。https://pino-hd.github.io最新のブログはいずれも上に掲載されます。
前言
コードを書く時はVSで太っていて、プログラムを書くたびにプロジェクトを作成して、空間を占用していますので、mingwをインストールしました。コマンドラインの中で直接gccコンパイルができます。とても便利です。アムウェイは後でプログラムをコンパイルする時に、必ず-l wsock32オプションを追加します。mingwはデフォルトでwindowsライブラリが含まれていません。
TCPバージョン
  • SERVER端
  • #include 
    #pragma comment(lib, "ws2_32.lib")
    #include 
    
    int main(int argc, char* argv[]) {
        WSADATA wsaData;
        WORD sockVersion = MAKEWORD(2, 2);
        if (WSAStartup(sockVersion, &wsaData) != 0) {
            return 0; 
        }
        SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sListen == INVALID_SOCKET) {
            printf("socket error
    "); return 0; } struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(4500); sin.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("socket error
    "); closesocket(sListen); return 0; } if (listen(sListen, 5) == SOCKET_ERROR) { printf("socket error
    "); closesocket(sListen); return 0; } struct sockaddr_in remoteAddr; SOCKET sClient; int nAddrLen = sizeof(remoteAddr); char revData[255]; while(TRUE){ sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen); if (sClient == SOCKET_ERROR) { printf("accept() error
    "); continue; } printf(" :%s \r
    ", inet_ntoa(remoteAddr.sin_addr)); int ret = recv(sClient, revData, 255, 0); if (ret > 0) { revData[ret] = 0x00; printf(revData); } char* buff = (char*)"\r
    Hello, my friend\r
    "; send(sClient, buff, strlen(buff), 0); closesocket(sClient); } closesocket(sListen); WSACleanup(); return 0; }
  • CLIENT端
  • #include 
    #include 
    
    #pragma comment(lib, "ws2_32.lib")
    
    int main(int argc, char* argv[]) {
        WSADATA wsaData;
        WORD sockVersion = MAKEWORD(2, 2);
        if (WSAStartup(sockVersion, &wsaData) != 0) {
            return 0;
        }
        SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (sClient == SOCKET_ERROR) {
            printf("socket error
    "); return 0; } struct sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(4500); servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if (connect(sClient, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) { printf("socket error
    "); closesocket(sClient); return 0; } char* buff = (char*)"\r
    Hello, my friend\r
    "; send(sClient, buff, strlen(buff), 0); char revData[255]; int ret = recv(sClient, revData, 255, 0); if (ret > 0) { revData[ret] = 0x00; printf(revData); } closesocket(sClient); WSACleanup(); return 0; }
  • コンパイル
  • gcc server.c -o server -lwsock32
    gcc client.c -o client -lwsock32
    
    UDPバージョン
  • SERVER端
  • #include 
    #pragma comment(lib, "ws2_32.lib")
    #include 
    
    
    int main(int argc, char* argv[])
    {
        WSADATA wsaData;
        WORD sockVersion = MAKEWORD(2, 2);
        if (WSAStartup(sockVersion, &wsaData) != 0)
        {
            return 0;
        }
    
        SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        if (serSocket == INVALID_SOCKET)
        {
            printf("socket error !");
            return 0;
        }
    
        struct sockaddr_in serAddr;
        serAddr.sin_family = AF_INET;
        serAddr.sin_port = htons(8000);
        serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
        if (bind(serSocket, (SOCKADDR*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
        {
            printf("bind error !");
            closesocket(serSocket);
            return 0;
        }
    
        struct sockaddr_in remoteAddr;
        int nAddrLen = sizeof(remoteAddr);
        while (TRUE)
        {
            char recvData[255];
            int ret = recvfrom(serSocket, recvData, 255, 0, (SOCKADDR*)&remoteAddr, &nAddrLen);
            if (ret > 0)
            {
                recvData[ret] = 0x00;
                printf("       :%s \r
    ", inet_ntoa(remoteAddr.sin_addr)); printf(recvData); } char * sendData = " UDP
    "; sendto(serSocket, sendData, strlen(sendData), 0, (SOCKADDR*)&remoteAddr, nAddrLen); } closesocket(serSocket); WSACleanup(); return 0; }
  • CLIENT端
  • #include 
    #pragma comment(lib, "ws2_32.lib")
    #include 
    
    
    int main(int argc, char* argv[])
    {
        WORD socketVersion = MAKEWORD(2, 2);
        WSADATA wsaData;
        if (WSAStartup(socketVersion, &wsaData) != 0)
        {
            return 0;
        }
        SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    
        struct sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(8000);
        sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        int len = sizeof(sin);
    
        char * sendData = "Hello, my friend
    "; sendto(sclient, sendData, strlen(sendData), 0, (SOCKADDR*)&sin, len); char recvData[255]; int ret = recvfrom(sclient, recvData, 255, 0, (SOCKADDR*)&sin, &len); if (ret > 0) { recvData[ret] = 0x00; printf(recvData); } closesocket(sclient); WSACleanup(); return 0; }
  • コンパイル
  • gcc server_udp.c -o server_udp -lwsock32
    gcc client_udp.c -o client_udp -lwsock32
    
    締め括りをつける
    TCPバージョンのプログラムにとって
    server  :  WSAStartup -》  !=0 -》  socket -》  SOCKET_ERROR -》  sockaddr_in   -》bind -》  SOCKET_ERROR -》listen -》  SOCKET_ERROR -》     -》accept -》  SOCKET_ERROR -》  、    
    
    client  :  WSAStartup -》  !=0 -》  socket -》  SOCKET_ERROR -》  sockaddr_in   -》connect -》  SOCKET_ERROR -》  、    
    
    UDPバージョンのプログラムにとって
    server  :  WSAStartup -》  !=0 -》  socket -》  SOCKET_ERROR -》  sockaddr_in   -》bind -》  SOCKET_ERROR -》     -》  、    
    
    client  :  WSAStartup -》  !=0 -》  socket -》  SOCKET_ERROR -》  sockaddr_in   -》  、    
    
    TCPでは、sendとrecv関数を用いてメッセージUDPを送受信し、sendtoとrecvfrom関数を用いてメッセージを送受信する。