実験2_ネットワークプログラミング(4)に基づくストリームソケットサーバプログラム

#define _WINSOCK_DEPRECATED_NO_WARNINGS 
する#include <iostreamの> 
の#include <winsock2.h> 使用して名前空間をSTD。#pragmaコメント(LIB、 "WS2_32.LIB")の#define PORT 7210
 の#define IP_ADDRESS "192.168.0.103"
 の#define MAX_LINE 10000 
DWORD WINAPI ClientThread(LPVOID lpParameter)
{ 構造体のsockaddr_in CLIENTADDR。
    INT addrlenは= はsizeof (CLIENTADDR)。
    SOCKET CientSocket = (SOCKET)lpParameter。
    int型 iResult = 0 ;
    CHAR

 





    RecvBuffer [MAX_LINE]。
    一方、
    { 
        memsetの(RecvBuffer、0x00ではsizeof (RecvBuffer))。
        iResult = RECV(CientSocket、RecvBuffer、MAX_LINE、0 ); 
        getpeername(CientSocket、(構造体のsockaddr *)&CLIENTADDR、&addrlenは);
        もし(iResult == 0 || iResult == SOCKET_ERROR)
        { 
            COUT << " 客户" << INET_NTOA(ClientAddr.sin_addr)<< " " << ClientAddr.sin_port <<" 出口" << てendl;
             // クライアント終了
            BREAK ; 
        } 
        // 情報サーバは、出力の受け取り 
        はcout << " クライアント" << << INET_NTOA(ClientAddr.sin_addrを)" " << ClientAddr.sin_portを< < " と彼は言う:" << recvbuffer << てendl; 
        iResult =センド(CientSocket、recvbuffer、(int型)はstrlen(recvbuffer)、0 );
         // クライアントに受信した文字列のバック
    } 

    を返す 0 ;
} 

INTメイン(INTARGC、CHAR * ARGV [])
{ 
    WSADATA WSADATA。
    SOCKET ServerSocketを、ClientSocket。
    構造体LocalAddrは、CLIENTADDRのsockaddr_in。
    int型 iReuslt = 0 ;
    int型 addrlenは= 0 ; 
    HANDLE hThread = NULL; 

    // 初期のWindowsソケット
    の場合(WSAStartupの(MAKEWORD(22)、&WSADATA)=!0 
    { 
        coutの << " 初期のWindowsソケットに失敗しました:: " << WSAGetLastError()<< てendl;
        WSACleanup(); 
        のinet_addr(IP_ADDRESS)。リターン - 1 
    } 

    // ソケット作成 
    のServerSocket = ソケット(AF_INET、SOCK_STREAM、IPPROTO_TCP)。
    もし(ServerSocketを== INVALID_SOCKET)
    { 
        COUT << " 创建ソケット失败:: " << WSAGetLastError()<< ENDL。
        closesocket(ServerSocketを)
        WSACleanup(); 
        リターン - 1 
    } 

    LocalAddr.sin_family = AF_INET。
    LocalAddr.sin_addr.s_addr = 
    LocalAddr.sin_port = htons(PORT)。
    memset(LocalAddr.sin_zero、0x00の8 )。

    // バインドソケット 
    iReuslt =バインド(ServerSocketを、(構造体のsockaddr *)&LocalAddrは、はsizeof (LocalAddrは));
    もし(!iReuslt = 0 
    { 
        coutの << " バインドソケットは失敗しました:: " << WSAGetLastError()<< てendl; 
        WSACleanup(); 
        リターン - 1 
    } 
    // 聞く 
    iReusltを聞く=(のServerSocketを10 )。
    もし(iReuslt!= 0 
    { 
        裁判所未満 << " 待機ソケットに失敗しました:: " << WSAGetLastError()<< てendl;
        リターン - 1 
    } 

    COUT << " 服务端已经启动" << ENDL。

    一方、
    { 
        addrlenは = はsizeof (CLIENTADDR)。
        ClientSocket =受け入れる(ServerSocketを、(構造体のsockaddr *)&CLIENTADDR、&addrlenは)。
        もし(ClientSocket == INVALID_SOCKET)
        { 
            裁判所未満 << " 受け入れに失敗しました:: " << WSAGetLastError()<< てendl;
            休憩; 
        } 

        COUT << " 客户端连接:: " << INET_NTOA(ClientAddr.sin_addr)<< " " << ClientAddr.sin_port << ENDL。

        hThread =のCreateThread(NULL、0、ClientThread、(LPVOID)ClientSocket、0 、NULL);
        もし(hThread == NULL)
        { 
            COUT << " 失敗したスレッドを作成しよう!"<< てendl;
             
        } 

        CloseHandleを(hThread)。
    } 

    closesocket(ServerSocketを)
    closesocket(ClientSocket)。
    WSACleanup(); 

    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/cyx-b/p/12554930.html