TCP通信の実現(C ++)

  TCP通信機構、全二重の形でクライアントとサーバの間のリンク(送信され得るデータ、さらにデータを受信することができる)、この処理は実行されない信頼性の高いデータ伝送(データの送受信であります「コンピュータネットワーク - トップダウン」、UDPはなぜ信頼性の高い伝送の詳細などはありません)失われます、を参照してください、次のコードは、C実装モデルで使用されている++

  1.TCP ------サーバー

#pragma警告(無効:4996);
書式#include <iostreamの>
書式#include <winsock2.h>
書式#include <WINDOWS.H>
名前空間stdを使用。
#pragmaコメント(libに、 "WS2_32.LIB")
クラスTCP
{
公衆:
    空check_version();
    空intintail();
    空blind_listen();
    空sent_recv();
民間:
    WSAD日。
    SOCKETのsock_server。
    SOCKETのsock_client。
    SOCKADDR_INのadd_server。
    SOCKADDR_INのadd_client。

    

}。
メインint型()
{
    TCPのA;
    a.check_version();
    a.intintail();
    a.blind_listen();
    a.sent_recv();
  
}
無効TCP :: check_version()
{
// int型RET = WSAStartupの(MAKEWORD(2,2)、およびデータ)。
    (WSAStartupの(MAKEWORD(2,2)、およびデータ)!= 0)の場合
    {
        裁判所未満<<「ソケットバージョンエラー」<<てendl;
        WSACleanup();
    }
    そうしないと
    {
        COUTは<< << ENDL「ソケットのバージョンが正しいですか」。
    }
}

無効TCP :: intintail()
{
    設定//ソケットインタフェース
    sock_server =ソケット(AF_INET、SOCK_STREAM、0);
    //設定された構成アドレス
    add_server.sin_family = AF_INET;
    add_server.sin_port = htons()。
    add_server.sin_addr.S_un.S_addr =のinet_addr( ""); // IPアドレスを記入
}ボイドTCP :: blind_listen(){int型N =はsizeof(SOCKADDR_IN); int型RET =バインド(sock_server、(LPSOCKADDR)&add_server、N);(RET == SOCKET_ERROR){COUT <<「バインドソケットが失敗した場合"<<てendl; WSACleanup();}他{裁判所未満<<" バインドソケット成功「<<てendl;} //ソケットint型RET2 =(sock_server、10)を聞くリスニングを開始; // 2番目の未完成のキューとキューパラメータ決定が完了している場合の合計の最大接続数(RET2 == SOCKET_ERROR){COUT << << ENDL「モニター失敗」; WSACleanup();}他{COUT <<「モニター成功」 <<てendl;}}無効TCP :: sent_recv(){coutの<< << "リンククライアントに準備している" << "\ tで" "しばらくお待ちください" <<てendl;スリープ(3000);ながら、 (真){int型のlen =はsizeof(SOCKADDR); //最初のクライアントsock_clientをリンク=受け入れるようになった(sock_server、(LPSOCKADDRを)&add_client、&LEN);場合(sock_client == SOCKET_ERROR){coutの<< "リンク障害" << ENDL; WSACleanup();ブレーク;}他{COUT << "成功した" リンク<< ENDL;} //チャーSERの送信およびデータを受信する[100] = "ハロークライアント"(送信(sock_client、SER、100、0)== SOCKET_ERROR)場合{COUT << "送信失敗" << ENDL; WSACleanup();ブレーク;}他{COUTは<< "正常に送信され、" << ENDL;}}}

    2TCP -----クライアント

#pragma警告(無効:4996);
書式#include <iostreamの>
名前空間stdを使用。
書式#include <winsock2.h>
#pragmaコメント(libに、 "WS2_32.LIB")
書式#include <WINDOWS.H>
クラスTCP
{
公衆:
    空intalize();
    空my_connect();
    空my_recv();

民間:
    SOCKETのsock_client。
    SOCKADDR_INのaddr_server。
    SOCKADDR_IN CLIENT_ADDR;
    WSAD日。
公共:チャーREC [100]; //受信するためのアレイと印刷
      lenはint型。
}。

メインint型()
{
    TCPのA;
    a.intalize();
    a.my_connect();
    a.my_recv();
  
}
無効TCP :: intalize()
{
    (WSAStartupの(MAKEWORD(2、2)、およびデータ)!= 0)の場合
    {
        裁判所未満<<「ソケットバージョンエラー」<<てendl;
        WSACleanup();
    }
    そうしないと
    {
        COUTは<< << ENDL「ソケットのバージョンが正しいですか」。
    }
    memset(&addr_server、0、はsizeof(addr_server))。
    sock_client =ソケット(AF_INET、SOCK_STREAM、0);
    もし(sock_client == INVALID_SOCKET)
    {
        裁判所未満<<「の設定に失敗しました」<<てendl;
        WSACleanup();
    }
    そうしないと
    {
        裁判所未満<< "正常に設定" <<てendl;
    }
    addr_server.sin_family = AF_INET;
    addr_server.sin_port = htons(); //コンピュータの任意のポートを選択
    addr_server.sin_addr.S_un.S_addr =のinet_addr( ""); // IPアドレスを記入
    LEN =はsizeof(SOCKADDR_IN)。
}

無効TCP :: my_connect()
{
    もし(CONNECT(sock_client、(LPSOCKADDR)&addr_server、LEN)== SOCKET_ERROR)
    {
        coutの<< <<てendl "接続に失敗しました"。
        WSACleanup();
    }
    そうしないと
    {
        裁判所未満<< "正常に接続" <<てendl;
    }
}

無効TCP :: my_recv()
{

    もし(RECV(sock_client、REC、1,0)== SOCKET_ERROR)
    {
        裁判所未満<< "受信失敗" <<てendl;
        WSACleanup();
    }
    そうしないと
    {
        裁判所未満<< "受信成功" <<てendl;
        COUTは<< "Information Serverがある:" << REC <<てendl;
    }
}

  【リマーク】

(無効:4996)の#pragma警告を追加しない場合のinet_addr()vs2017で呼び出し、vs2019のため、エラーになりますので、問題のバージョン

おすすめ

転載: www.cnblogs.com/dfxdd/p/12221939.html